Voici une réponse à la question bonus.
En fait, je veux mettre la date de création d'une photo dans son nom de fichier, pour obtenir quelque chose comme 20091231 2359 New Year.jpg. J'ai peur d'avoir besoin d'une combinaison de commandes non triviale pour y parvenir?
En supposant que vous souhaitez prendre la date de création de la photo à partir des données EXIF, vous aurez besoin d'un outil distinct pour cela. Heureusement, il s'avère que cela 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
Edit : 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 la mise en forme de la date à votre guise, jetez un œil à la sortie de date --help
, par exemple; il répertorie 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 juste la partie renommée, le programme «renommer» fonctionnera. C'est la même chose que l'exemple que vous avez vu dans la page de manuel, juste changé.
la source
La clé est que, si vous avez vu un exemple qui montre comment fusionner une partie du nom de fichier avec une expression régulière, 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 être après un
.
caractère.la source
mv "$file" yourfile"${file#myfile}"
. Fonctionne sur n'importe quel shell Bourne moderne (ou sur n'importe quel shell POSIX), mais probablement pas sur le shell Bourne réel.Voici quelques façons différentes de manipuler les noms de fichiers
Les extensions de paramètres dans la
mv
commande fonctionnent comme suit:${f%.*}
- Supprimez le motif de correspondance le plus court de la fin de la chaîne contenue dans$f
, dans ce cas, supprimez tout après et y compris le dernier point. Le single%
signifie "le plus court de la fin".${f##*.}
- Supprimez le motif de correspondance le plus long depuis le début de la chaîne contenue dans$f
, dans ce cas, tout ce qui précède et inclut le dernier point (cela inclut également les autres points). Le double#
(##
) signifie "le plus long depuis le début".Ainsi, par exemple, si
$f
contient "Foo.bar.baZ.jpg":donne
et
donne
Ainsi, la
mv
commande, une fois développée, ressemblerait à:la source
f%
etf##
sont décrits ici, par exemple: tldp.org/LDP/abs/html/parameter-substitution.htmlIl n'y a aucune extension de nom de fichier sous Linux.
Utilisez des expressions régulières pour couper des sous-chaînes particulières du nom de fichier et y accéder.
Exemple:
Scénario réel: vous extrayez du HTML à partir d'un fichier chm. Les noms de fichiers sous Windows ne sont pas sensibles à la casse, donc sous Linux, vous obtiendrez des liens rompus. Vous avez un fichier nommé index.HTML , mais href = "index.html" dans les URL. Votre objectif est donc d'adapter les noms de fichiers pour qu'ils correspondent aux liens.
Supposons que vous ayez le nom de fichier dans une variable:
À partir de la version 3.0, bash prend en charge les expressions régulières lui-même, vous n'avez donc pas besoin d'outils supplémentaires comme grep / sed / perl, etc. pour effectuer une manipulation de chaîne. L'exemple suivant illustre le remplacement d'une correspondance principale dans une chaîne:
La correspondance et les chaînes de remplacement peuvent être paramétrées si vous le souhaitez, cela offre une flexibilité supplémentaire lors de l'écriture du script. L'extrait de code suivant atteint le même objectif:
Consultez les documents bash pour plus d'informations.
la source
En voici une autre:
la source
Il y a toujours plus d'une façon de le faire. J'ai mis le script suivant sous / usr / local / bin / mrename.
Ensuite, dans le script contenant les fichiers photo, tapez simplement: mrename
Il y a aussi une fonctionnalité optionnelle commentée dans le script pour mettre à l'échelle les photos (en utilisant ImageMagick).
J'espère que cela est utile pour certaines personnes.
la source
Vous pouvez utiliser l'
-X/--keep-extension
option avecrename
(version 1.600):-X, --keep-extension Save and remove the last extension from a filename, if there is any. The saved extension will be appended back to the filename at the end of the rest of the operations.
rename
est disponible pour Mac depuis Homebrew et pour Linux depuis Linuxbrew (entre autres options d'installation bien sûr).la source