Ajouter une extension de fichier aux fichiers avec bash

93

Quel est le bon moyen d'ajouter l'extension de fichier ".jpg" aux fichiers sans extension avec bash?

Adrian
la source
3
mv "${file}" "${file}.jpg"?
onteria_
2
à votre avis, qu'est-ce qu'un "fichier sans extension"? Est-ce un fichier sans point dans le nom?
glenn jackman

Réponses:

116
for f in *.jpg; do mv "$f" "${f%.jpg}"; done
for f in *; do mv "$f" "$f.jpg"; done
Seth Robertson
la source
8
le second est parfait pour renommer des fichiers sans extension! Merci!
anon58192932
2
le second ajoute une extension sur tous les fichiers, pas seulement ceux sans extension
Jeff
5
tout comme une note "${f%.jpg}"est la manipulation de chaînes de shell bash. `$ {string% substring}` Supprime la plus courte correspondance de $ substring à l'arrière de $ string.
Jichao
Attention: si vous avez un dossier avec des extensions mixtes, sachez que ce qui précède s'ajoute .jpgmême aux fichiers normaux.
sachinruk
61

Vous pouvez utiliser renommer:

rename 's/(.*)/$1.jpg/' *
Kim Stebel
la source
3
quelle version de changement de nom utilisez-vous? Le mien a des arguments différents:rename from to file...
B Johnson
1
rename est inclus avec perl, qui est la version 5.10.1.
Kim Stebel
3
Cela fonctionne très bien avec le renommage inclus dans Ubuntu (et donc je suppose que toutes les distributions basées sur Debian), beaucoup moins verbeux que la réponse de jm666.
Roger Heathcote
28

Une autre façon - sans boucles

find . -type f -not -name "*.*" -print0 |\
xargs -0 file |\
grep  'JPEG image data' |\
sed 's/:.*//' |\
xargs -I % echo mv % %.jpg

Panne:

  • trouver tous les fichiers sans extension
  • vérifier le type de fichier
  • filtrer uniquement les fichiers JPG
  • supprimer les informations sur le type de fichier
  • xargs lance le "mv" pour chaque fichier

la commande ci-dessus est pour une exécution à sec , après cela, vous devez supprimer le "echo" avant mv

EDIT Certaines personnes suggérant que ici est nécessaire "Mettre les arguments de chemin entre guillemets; évite le fractionnement des arguments sur les chemins avec des espaces" .

Habituellement, cette recommandation est vraie, dans ce cas ne l'est pas. Parce que, ici, le %n'est pas remplacé par l'expansion du shell mais par le xargsinterne (directement), donc le %sera remplacé correctement même avec des espaces dans les noms de fichiers.

Démo simple:

$ mkdir xargstest
$ cd xargstest

# create two files with spaces in names
$ touch 'a b' 'c d'

$ find . -type f -print
./c d
./a b
# notice, here are spaces in the above paths

#the actual xargs mv WITHOUT quotes
$ find . -type f -print | xargs -I % mv % %.ext

$ find . -type f -print
./a b.ext
./c d.ext
# the result is correct even in case with spaces in the filenames...
jm666
la source
Vous pouvez mettre cela en boucle et ces xargs sont superflus. J'aime mieux la réponse de Ryan dans cette situation.
Lucius
1
@Lucius - btw, la question veut des fichiers "sans extension" - donc Ryan ne devrait trouver que ceux-là ...
jm666
@ jm666 hé! comment puis-je modifier votre extrait de code pour renommer tous les fichiers sans extension d'un dossier en leurs extensions respectives. (Je détecte les extensions correctes par la commande file -b $ filename.)
Soumyajit
24

Simple, cd dans le répertoire où se trouvent vos fichiers et:

for f in *;do mv $f $f.jpg;done
bharat
la source
Pour une raison quelconque, cela fonctionne pour moi, mais la solution de Seth avec des guillemets ne le fait pas. (OSX Mountain Lion bash)
delrocco
4
Ce serait mieux s'il était utilisé for f in *;do mv "$f" "$f".jpg;donepour prendre en charge les espaces dans les noms de fichiers.
Hritik
Merci pour cette solution élégante et simple - j'ai atterri sur cette réponse plusieurs fois, mais je n'arrive pas à la mémoriser. #dejavu
Tim Andersen
15

course à sec:

 rename -n s/$/.jpg/ *

changement de nom réel:

 rename s/$/.jpg/ *
Alexey
la source
6
find . | while read FILE; do if [ $(file --mime-type -b "$FILE") == "image/jpeg" ]; then mv "$FILE" "$FILE".jpg; fi; done;
Ryan Li
la source
1

Dans mon cas, je n'étais pas au courant du type de fichier, j'ai donc utilisé la commande mv à l'aide de la commande file pour examiner et éventuellement trouver le type de fichier. Cette solution n'est peut-être pas parfaite pour tous les fichiers car la commande file peut ne pas reconnaître le type de fichier, mais cela a fonctionné très bien pour moi.

for f in *; do ext=$(file $f | awk '{print $2;}'); mv -n "$f" "$f.$ext"; done

L'utilisation de awk consiste à supprimer le deuxième mot de la chaîne renvoyée par le fichier de commandes qui est en fait l'extension.

Paolo
la source
gère automatiquement les jpg et png. utilisé et fonctionne - merci beaucoup! Ce n'est que maintenant que les extensions sont des CAPS. petit problème cependant :)
krivar le
0
rename --dry-run * -a ".jpg" # test  
* -a ".jpg" # rename
Roman Rhrn Nesterov
la source
--dry-runet -ane sont pas disponibles dans ma version de rename. Si cela est spécifique à une architecture, il doit être spécifié.
Fernando César
0

Vous pouvez utiliser déplacer plusieurs fichiers . Je suis un mainteneur de ce projet. La syntaxe est simple.

mmf files*

Il ouvrira votre $ EDITOR avec tous les noms de fichiers, ou vim par défaut et vous pourrez simplement mettre en surbrillance la fin de tous les noms de fichiers en utilisant Ctrl + v + G dans vim, enregistrer le fichier, quitter et que tout vos fichiers soient renommés

Almas Abdrazak
la source
-2

Ryan Li

La syntaxe correcte pour ajouter une extension de fichier à plusieurs fichiers dans un répertoire qui n'ont pas d'extension de fichier est

find . | while read FILE; do if [[ -n `file --mime-type "$FILE" | grep 'message/rfc822'` ]]; then  mv "$FILE" "$FILE".eml; fi; done;
Dillon Beresford
la source