Mon importateur de photos a déplacé les fichiers de mon appareil photo et les a renommés, mais j'ai oublié de préciser que l'extension de fichier doit être conservée. Donc , j'ai plusieurs dossiers avec des centaines de fichiers JPG et AVI qui n'ont pas tous l'extension appropriée.
Il n'y a pas beaucoup de fichiers vidéo, je peux donc les renommer manuellement avant ou après un changement de nom général en masse en JPG.
Pour rendre les choses plus compliquées, les noms de fichiers contiennent des espaces, je ne peux donc pas simplement mv "*" "*.jpg"
car, eh bien, cela ne fonctionne pas (mais c'est ce que je ferais avec DOS/Windows).
Je sais que Linux est plein de commandes puissantes. Comment puis-je renommer en masse des fichiers pour ajouter une extension .jpg, lorsque ces fichiers contiennent des espaces?
S'il vous plaît ne dites pas "n'utilisez pas d'espaces" car ce n'est vraiment pas ce que je demande. Merci.
Les globes de shell devraient fonctionner même avec des espaces dans les noms s'ils sont utilisés correctement, par exemple.
rename -nv -- 's/$/.jpg/' *
ou
for file in *; do echo mv -- "$file" "$file.jpg"; done
[REMARQUE: ce sont des "no ops" jusqu'à ce que le commutateur n
ou le echo
soient supprimés - vous pouvez donc vérifier le remplacement correct avant de valider.]
Si vous souhaitez distinguer automatiquement les fichiers jpg et avi, il serait également possible d'utiliser une boucle plus complexe et la commande file
ou mimetype
Si vous avez une hiérarchie plus complexe, vous aurez besoin d'une approche légèrement plus sophistiquée. Vous pouvez utiliser l'option globstar
de bash qui permet à **
de faire correspondre zéro ou plusieurs répertoires et sous-répertoires, ou vous pouvez utiliser find
.
globstar
shopt -s globstar
for f in **/*; do [ -f "$f" ] && mv "$f" "$f".jpg; done
Le [ -f "$f" ] &
garantit que la commande mv
est uniquement exécutée sur des fichiers et non sur des répertoires.
find
find . -type f -print0 | xargs -0 -I{} mv "{}" "{}".jpg
Le -type f
garantit que nous ne trouvons que des fichiers et pas de répertoires et le print0
fait en sorte que find
imprime sa sortie séparée par le caractère null (\0
) au lieu de nouvelles lignes. Cela garantit que nous traitons correctement les noms de fichiers contenant des espaces, des nouvelles lignes ou d’autres bizarreries.
xargs
prend une liste d'entrées et exécute la commande qui y est donnée. L’indicateur -0
lui indique d’attendre une entrée séparée par un caractère null et le -I{}
lui fera remplacer chaque instance de {}
par chacun des enregistrements d’entrée (fichiers dans ce cas) transmis.
Je vous conseillerais d'utiliser un programme appelé pyrenamer
.
Ouvrez-le et, dans le modèle de nom de fichier renommé, entrez {1}.jpg
.
Veuillez vous référer à man rename
avant d'essayer ceci
Cela devrait fonctionner comme un charme.
Dans un terminal:
cd /path/to/exported/imgs/folder/
rename 's/(\w+)$/$1\.jpg/' *
S'il vous plaît changer "jpg" à tout ce dont vous avez besoin.
rename
peut utiliser les expressions Perl .. votre meilleur ami
A la première ligne, vous avez entré votre répertoire de fichiers
cd /path/to/exported/imgs/folder/
Le s
le avant expression indique une substitution
renommer 's / (\ w +) $ / $ 1\.jpg /' *
Puis cherchera n'importe quel fichier avec un nom alphanumérique et un trait de soulignement, mais sans extension
renommer/(\ w +) $/$ 1\.jpg/'*
Et remplacer ajouter à cela. un point jpg
renommer '/ (\ w +) $/$ 1 \. jpg /' *
Enfin appliquer à n'importe quel fichier dans le dossier de première ligne
renommer '/ (\ w +) $/$ 1\.jpg /' *
Je rencontre souvent cette situation dans l'administration de systèmes, en particulier lorsqu'il s'agit de noms de fichiers créés par des applications Windows. Pour ajouter des extensions .jpg
à des noms de fichiers sans aucune extension, prenez en compte cette liste de commandes.
find ./example -type f -name '*' -print0 | xargs -0 -I'{}' mv '{}' '{}'.jpg
le -print0
de find génère des caractères NULL pour les séparateurs, le -0
de xargs sert à accepter ces séparateurs NULL. Cela fonctionnera également pour tous les sous-répertoires. Veillez donc à remplacer le chemin "./example".
rename
est une excellente commande, mais elle est spécifique à la distribution, à la fois en implémentation et en spécification. J'utilise généralement des éléments tels que rename
sur la ligne de commande, mais j'écris toujours dans les normes GNU utils pour mes scripts.