ajouter récursivement l'extension de fichier à tous les fichiers

106

J'ai quelques répertoires et sous-répertoires contenant des fichiers sans extension de fichier. Je souhaite ajouter .jpgà tous les fichiers contenus dans ces répertoires. J'ai vu des scripts bash pour changer l'extension de fichier mais pas simplement pour en ajouter une. Il doit également être récursif, quelqu'un peut-il aider s'il vous plaît?

robjmills
la source

Réponses:

228

Commande alternative sans boucle explicite ( man find):

find . -type f -exec mv '{}' '{}'.jpg \;

Explication: cela trouve récursivement tous les fichiers ( -type f) à partir du répertoire courant ( .) et applique la commande de déplacement ( mv) à chacun d'eux. Notez également les guillemets autour {}, afin que les noms de fichiers avec des espaces (et même des retours à la ligne ...) soient correctement gérés.

Stephan202
la source
7
En particulier, celui-ci fonctionne mieux s'il y a un grand nombre de fichiers dans la structure de répertoires (ce qui fait que bash s'inquiète de la longueur de la liste de fichiers à parcourir).
DrAl
@Al, si vous faites référence à une forboucle bouleversante bash pour itérer sur une liste de fichiers, ce n'est pas correct. La forboucle bash émet chaque mvcommande de manière itérative .
nik
Question: Configure-t-il d' findabord une liste de fichiers avant d' exécuter l' -execinstruction? Je suppose que oui, mais je veux clarifier ce point avant de coder des boucles infinies.
Boldewyn
2
cette commande trouvera également les fichiers avec l'extension. C'est ce que veut OP?
ghostdog74
1
@ ghostdog74: Depuis qu'il a accepté cette réponse, ce qui précède a apparemment fait l'affaire. Sinon, comme vous l'avez mentionné ci-dessous, l'ajout -not -name "*.*"fera l'affaire.
Stephan202
62

cela trouvera les fichiers sans extension et ajoutera votre .jpg

find /path -type f -not -name "*.*" -exec mv "{}" "{}".jpg \;
ghostdog74
la source
Cela fournira très certainement le résultat souhaité 99% du temps. +1
les
9

C'est un peu tard, mais j'ai pensé ajouter qu'une meilleure solution (bien que peut-être moins lisible) que celles jusqu'à présent pourrait être:

find /path -type f -not -name "*.*" -print0 | xargs -0 rename 's/(.)$/$1.jpg/'

En utilisant le find | xargs modèle entraîne généralement une exécution plus efficace, car vous n'avez pas à créer un nouveau processus pour chaque fichier.

Notez que cela nécessite la version de rename trouvée dans les distributions à saveur Debian (aka prename), plutôt que le renommage traditionnel. C'est juste un minuscule script perl, donc il serait assez facile d'utiliser la commande ci-dessus sur n'importe quel système.

Chad Huneycutt
la source
4

comme ça,

for f in $(find . -type f); do mv $f ${f}.jpg; done

Je ne m'attends pas à ce que vous ayez des noms de fichiers séparés par des espaces,
si vous le faites, les noms devront être traités un peu.

Si vous souhaitez exécuter la commande à partir d'un autre répertoire,
vous pouvez remplacer le find .par find /target/directory.

nik
la source
1
Il manque un 'do' et s'il y a des espaces dans le nom de fichier, il peut être préférable de citer le nom de fichier: for f in $ (find. -Type f); faire mv "$ f" "$ {f} .jpg"; done
DrAl
et je suppose que je le ferais à partir du répertoire de niveau supérieur?
robjmills
@seengee: oui. Notez que cette commande manque également le tiret dans -type.
Stephan202
J'ai dû aller quelque part et j'ai tapé trop vite ... réparant maintenant.
nik
1

Pour renommer tous les fichiers sans extension dans Windows Basic, vous pouvez le faire ren * *.jpg Puisque le fichier n'est pas une extension, utilisez simplement le *, ou si vous voulez changer png en jpg, utilisezren *.png *.jpg

Nuno
la source
0

rename

Je ne suis pas sûr qu'il puisse renommer des fichiers sans extensions (je suis sous Windows 7 en ce moment)

dfa
la source
1
il peut, mais il renommera également les répertoires, et il n'y a aucun moyen de lui dire de fonctionner de manière récursive dans les sous-répertoires (du moins avec la version que j'ai sur Ubuntu).
mirod
Je connais au moins deux commandes différentes appelées rename, l'une un programme C inclus dans util-linux-ng et l'autre un programme Perl (par Wall lui-même) sur les machines Debian de notre université. En fait, aucun des deux ne fait de récursivité.
Boldewyn