web-dev-qa-db-fra.com

Renommez les fichiers JPG en fonction de la date de création

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?

26
Neilvert Noval
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.

55
Theo Band

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:

  • Comme tous les fichiers ne contiennent pas de données exif, nous voulons vérifier que dst est valide avant d’exécuter le reste des commandes. 
  • La sortie de exif a un espace, qui est un PITA pour les noms de fichiers. Utilisez sed pour remplacer par '-'.
  • Notez que j'utilise 'echo' avant le mv pour tester mes scripts. Lorsque vous êtes certain que vous agissez comme il convient, vous pouvez supprimer "l'écho" ... vous ne voulez pas vous retrouver comme le gars à qui tous les fichiers ont été volés.

Commander

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

Sortie

'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
15
fseto
for file in *jpg
do
 newfile=$(date "+%b %d %H:%M:%S%Y $file" -d "$(stat -c "%y" $file)")
 mv "$file" "$newfile"
done$
5
ghostdog74

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.

1

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.

1
three
$ for i in *; do mv "$i" "`stat -f %SB $i`"; done
1
DigitalRoss

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.

1
xxjjnn
find . -type f | xargs stat -f "mv %%N \"%%SB.jpg\"" | awk -F \; '{system $1;}'
1
akond

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
0
Curtis Yallop

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.

0
Jonathan Leffler

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.
0
tchrist