Voici une réponse à la question bonus.
Je veux en fait mettre une date de création de photo dans son nom de fichier, pour obtenir quelque chose comme 20091231 2359 NewYear.jpg. J'ai peur d'avoir besoin d'une combinaison non triviale de commandes pour y parvenir ?
En supposant que vous souhaitiez prendre la date de création de la photo à partir des données EXIF, vous aurez besoin d'un outil séparé pour cela. Heureusement, il s'avère que jhead
offre un moyen trivial de faire exactement ce que vous voulez, avec son -n
option.
$ jhead -h
[...]
-n[format-string]
Rename files according to date. Uses exif date if present, file
date otherwise. If the optional format-string is not supplied,
the format is mmdd-hhmmss. If a format-string is given, it is
is passed to the 'strftime' function for formatting
In addition to strftime format codes:
'%f' as part of the string will include the original file name
[...]
Voici un exemple :
$ jhead -n%Y-%m-%d-%f New_year.jpg
New_year.jpg --> 2009-12-31-New_year.jpg
Modifier :Bien sûr, pour faire cela pour un tas de photos, ce serait quelque chose comme :
$ for i in *jpg; do jhead -n%Y-%m-%d-%f $i; done
Pour modifier le formatage de la date à votre convenance, jetez un œil à la sortie de date --help
, par exemple; il listera les codes de format disponibles.
(jhead est largement disponible pour différents systèmes. Si vous êtes par exemple sur Ubuntu ou Debian, tapez simplement sudo apt-get install jhead
pour l'installer.)
Pour la partie renommage uniquement, le programme 'renommer' fonctionnera. C'est le même que l'exemple que vous avez vu dans la page de manuel, juste inversé.
[email protected]:/tmp/q$ touch myfile.{a,b,c,d}
[email protected]:/tmp/q$ ls
myfile.a myfile.b myfile.c myfile.d
[email protected]:/tmp/q$ rename -v s/myfile/yourfile/ myfile.*
myfile.a renamed as yourfile.a
myfile.b renamed as yourfile.b
myfile.c renamed as yourfile.c
myfile.d renamed as yourfile.d
[email protected]:/tmp/q$ ls
yourfile.a yourfile.b yourfile.c yourfile.d
[email protected]:/tmp/q$
betelgeuse:tmp james$ ls myfile.* yourfile.*
ls: yourfile.*: No such file or directory
myfile.a myfile.b
betelgeuse:tmp james$ for file
> in myfile.*
> do
> mv "${file}" "`echo $file | sed 's/myfile\./yourfile./'`"
> done
betelgeuse:tmp james$ ls myfile.* yourfile.*
ls: myfile.*: No such file or directory
yourfile.a yourfile.b
La clé est que, si vous avez vu un exemple qui montre comment mung une partie du nom de fichier avec une regex, c'est le seul exemple dont vous avez besoin. Les extensions n'ont pas de statut spécial sur les systèmes de fichiers Unix - elles ne sont qu'une partie du nom de fichier qui se trouve après un .
caractère.