web-dev-qa-db-fra.com

Renommer des fichiers horodatés au jour précédent

Je souhaite renommer les fichiers d'un répertoire en numéros séquentiels, en fonction de cette règle:
nomfichier- [quelque date] => nomfichier- [date du jour précédent]

Par exemple, file20170329file20170328 et file20170327 doivent être renommés en file20170328file20170327 et file20170326.

J'ai comme 100 fichier, donc j'ai besoin d'une meilleure astuce que de renommer chaque fichier individuellement.

3
storm

Le script suivant:

  • pour chaque fichier
  • Si le nom du fichier est supérieur à 8 (c’est-à-dire qu’il est possible de tenir une date)
  • basefilename contient le nom du fichier sans les 8 derniers caractères
  • AUJOURD'HUI - contient les 8 derniers caractères (la date)
  • HIER - détient un jour avant $ AUJOURD'HUI en tant que 8 caractères
  • Au lieu d'utiliser mv, j'ai créé un dossier /tmp/storage, et le script copiera les fichiers à cet emplacement. Ainsi, renommer un fichier ne corrompra pas un autre fichier si, par hasard, le nom de fichier de base des deux fichiers est identique, mais que la date diffère d'un jour à l'autre.

Remarque: pour permettre au script d’exécuter la cp, vous devez supprimer la echo de la ligne echo cp ....

mkdir -p /tmp/storage
for f in *
do
  if [ "${#f}" -gt 8 ]; then
    filebasename=${f::-8}
    TODAY=${f: -8}
    YESTERDAY=`date '+%C%y%m%d' -d "$TODAY-1 days"`
    echo cp $f /tmp/storage/${f//$TODAY}$YESTERDAY; 
  fi
done

exemple:

$ ls *20*
aaa2hhh20170329  aaahhh20170329  xajds20170222  xajsxs20170224

résultat du script:

cp aaa2hhh20170329 /tmp/storage/aaa2hhh20170328
cp aaahhh20170329 /tmp/storage/aaahhh20170328
cp xajds20170222 /tmp/storage/xajds20170221
cp xajsxs20170224 /tmp/storage/xajsxs20170223
3
Yaron

Si vous avez 100 fichiers (et avez accès à Perl rename, généralement le cas dans Ubuntu), vous pouvez utiliser:

for n in {100..1}; do rename -n "s/$(date --date="$n days ago" +"%Y%m%d")/$(date --date="$(($n+1)) days ago" +"%Y%m%d")/" *; done

Maintenant, lorsque vous utilisez -n pour les tests, il se plaint comme ceci:

rename(file20170217, file20170216)
file20170218 not renamed: file20170217 already exists
file20170219 not renamed: file20170218 already exists

Mais lorsque vous l'exécutez sans -n, le fichier n'existe plus et le changement de nom aboutit:

for n in {100..1}; do rename "s/$(date --date="$n days ago" +"%Y%m%d")/$(date --date="$(($n+1)) days ago" +"%Y%m%d")/" *; done

Si vous avez plus de 100 fichiers, vous devez augmenter la plage jusqu'à {150..1} ou peu importe.

C'est très lent. Il faudra peut-être 2 minutes ou plus pour renommer 100 fichiers. Mais ça marche.

4
Zanna

ou si vous préférez l’approche graphique, essayez krename, il a beaucoup de modules et vous pouvez écrire des scripts personnalisés, "la fonction système de la date", "le plugin de date/heure" pourrait fonctionner pour vous Krename GUI for plugins

http://www.krename.net/home/

Sudo apt-get install krename
0
Sumeet Deshmukh