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, file20170329
file20170328
et file20170327
doivent être renommés en file20170328
file20170327
et file20170326
.
J'ai comme 100 fichier, donc j'ai besoin d'une meilleure astuce que de renommer chaque fichier individuellement.
Le script suivant:
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
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.