Renommer les fichiers datés à la veille

4

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

Par exemple, file20170329 file20170328 et file20170327 doivent être renommés en file20170328 file20170327 et file20170326 .

J'ai comme fichier 100, donc j'ai besoin d'un meilleur truc que de renommer chaque fichier individuellement.

    
posée storm 29.03.2017 - 12:55
la source

3 réponses

4

Le script suivant:

  • pour chaque fichier
  • Si le nom de fichier est supérieur à 8 (c’est-à-dire qu’il peut contenir une date)
  • basefilename contient le nom du fichier sans les 8 derniers caractères
  • AUJOURD'HUI - contient les 8 derniers caractères (la date)
  • YESTERDAY - tient un jour avant $ TODAY comme 8 caractères
  • Au lieu d'utiliser mv , j'ai créé un dossier /tmp/storage et le script va copier les fichiers vers cet emplacement. De cette façon, renommer un fichier ne corrompra pas un autre fichier si, par hasard, le nom de base des deux fichiers est le même, mais que la date est différente en un jour

Remarque: pour autoriser le script à exécuter cp on devrait supprimer 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
    
réponse donnée Yaron 29.03.2017 - 13:08
la source
4

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 tester, il se plaint comme ceci:

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

Mais quand vous l'exécutez sans -n le fichier n'existe plus, le renommage est donc réussi:

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 à {150..1} ou autre.

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

    
réponse donnée Zanna 29.03.2017 - 13:36
la source
0

ou si vous préférez l’approche graphique, essayez krename, il a beaucoup de modules et vous pouvez y écrire des scripts personnalisés, "fonction du système de date", "le plug-in date-heure" pourrait fonctionner pour vous

lien

sudo apt-get install krename
    
réponse donnée Sumeet Deshmukh 29.03.2017 - 19:12
la source

Lire d'autres questions sur les étiquettes