web-dev-qa-db-fra.com

Comment ajouter en masse une extension de fichier?

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.

7

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

15
steeldriver

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.

  1. 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.

  2. 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.

7
terdon

Je vous conseillerais d'utiliser un programme appelé pyrenamer.

Ouvrez-le et, dans le modèle de nom de fichier renommé, entrez {1}.jpg.

4
Tim

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 /' *
4
Quijote Shin

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.

2
J. M. Becker