Je veux renommer tous les fichiers d'un certain répertoire. Renommez-les en leur date de création.
Donc, si mon fichier est Image1.jpg, il devrait renommer quelque chose comme "16 janvier 12:09:42 2011.jpg"
Je veux le faire en ligne de commande. J'ai essayé:
stat -f %SB Image0100.jpg
Mais comment puis-je combiner cela avec la commande mv
? Et comment vais-je parcourir stat
et mv
dans tous les fichiers?
Ou existe-t-il des moyens simples de renommer tous les fichiers avec leur date de création?
jhead -n DSCN0382.JPG
DSCN0382.JPG --> 0408-150734.jpg
n'importe quel argument strftime peut aussi être donné:
jhead -n%Y%m%d-%H%M%S *.jpg
Ceci renommera les fichiers correspondants par * .jpg au format AAAAMMJJ-HHMMSS
jhead -n%Y%m%d-%H%M%S DSCN0382.JPG
DSCN0382.JPG --> 20120408-150734.jpg
voir aussi la page de manuel pour de nombreuses autres options intéressantes. Vous pouvez par exemple corriger (décaler) la date EXIF. Ceci est très pratique lors de la fusion de fichiers provenant d'appareils photo différents lorsque l'heure de certains appareils photo est incorrecte.
Si vous utilisez un fichier JPG contenant EXIF data (par exemple, à partir d'un appareil photo numérique), vous pouvez utiliser ce qui suit pour obtenir la date de création à la place de stat.
exif -t 0x9003 -m Image0100.jpg
Sur demande, voici la commande et la sortie. Quelques points à noter:
dst
est valide avant d’exécuter le reste des commandes. for i in *.jpg; do
dst=$(exif -t 0x9003 -m $i ) &&
dst_esc=$(echo $dst | sed 's/ /-/g' ) &&
echo mv $i $dst_esc.jpg
done
'12379632.jpg' does not contain tag 'DateTimeOriginal'.
mv 15084688.jpg 2003:02:28-21:48:54.jpg
mv 15136312.jpg 2003:03:01-10:36:05.jpg
mv 15137960.jpg 2003:03:01-10:36:38.jpg
mv 15140744.jpg 2003:03:01-10:37:46.jpg
for file in *jpg
do
newfile=$(date "+%b %d %H:%M:%S%Y $file" -d "$(stat -c "%y" $file)")
mv "$file" "$newfile"
done$
La plupart des systèmes de fichiers POSIX n'enregistrent pas l'heure de création (et l'API ne l'expose certainement pas même si elle est enregistrée), vous êtes donc SOL.
Si, comme moi, vous devez parcourir Google encore et encore parce que vous vieillissez et que vous ne vous souvenez plus des choses, vous pouvez également utiliser gThumb, qui inclut un programme de modification du nom de lot qui fonctionne bien et porte un ancien nom -> nouveau nom Aperçu. Vraiment sympa.
$ for i in *; do mv "$i" "`stat -f %SB $i`"; done
Il y a aussi:
rename -v 's/.JPG/.jpeg/' *.JPG
rename -v 's/.jpeg/.jpg/' *.jpeg
exiv2 -r'RP_%Y%m%d_%H%M%S' rename *.jpg
donner à RP_20120801_063021.jpg par exemple. Cela fonctionne pour les Linux Debian (par exemple Ubuntu).
Les commandes de changement de nom sont pour quand certaines images sont .JPG ou .jpeg. Impossible de convertir le fichier .JPG directement au format .jpg car il est interprété comme étant identique.
find . -type f | xargs stat -f "mv %%N \"%%SB.jpg\"" | awk -F \; '{system $1;}'
Une alternative à Perl:
J'aime beaucoup le motif court pour ajouter un préfixe à chaîne fixe avec Perl:
/bin/ls *.jpg | Perl -pe 's/.*/mv "$&" "prefix_$&"/' | sh
Pour faire un préfixe de date, c'est un peu plus compliqué.
cat >t.pl
while(<*.jpg>) {
$mtime = (stat($_))[9];
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($mtime);
$year += 1900;
++ $mon;
printf("mv \"%s\" \"%d-%.2d-%.2d-%s\"\n", $_, $year, $mon, $mday, $_)
}
Perl t.pl | sh
Sur MacOS X 10.6.6 avec Bash (et, je pense, avec Korn Shell), cela fonctionne sur les noms de fichiers contenant des espaces:
echo > "x y"
for file in *
do
x=$(stat -f '%SB' -t '%Y%m%d.%H%M%S' "$file")
mv "$file" "$x"
done
Il utilise également la notation dérivée de l'ISO 8601 pour la date et l'heure. Clairement, si deux fichiers ont la même heure de modification, le dernier de ces fichiers dans l’ordre alphabétique est le seul qui restera. Cela perd également tout suffixe. Si vous traitez avec des fichiers '.jpg', vous voudrez probablement utiliser:
echo > "x y,jpg"
for file in *.jpg
do
x=$(stat -f '%SB' -t '%Y%m%d.%H%M%S.jpg' "$file")
mv "$file" "$x"
done
Comme le nom de sortie ($ x) ne contient aucun espace, les guillemets autour de "$ x" ne sont pas nécessaires dans la commande de déplacement, mais leur présence est cohérente.
Utilisez simplement exiftool . Voici un exemple tiré de de sa documentation :
exiftool -r '-FileName<CreateDate' -d %Y-%m-%d/%H%M_%%f.%%e dir
Both the directory and the filename may be changed together via the
"FileName" tag if the new "FileName" contains a '/'. The example above
recursively renames all images in a directory by adding a "CreateDate"
timestamp to the start of the filename, then moves them into new
directories named by date.