Quel est le bon moyen d'ajouter l'extension de fichier ".jpg" aux fichiers sans extension avec bash?
Quel est le bon moyen d'ajouter l'extension de fichier ".jpg" aux fichiers sans extension avec bash?
Réponses:
for f in *.jpg; do mv "$f" "${f%.jpg}"; done
for f in *; do mv "$f" "$f.jpg"; done
"${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.
.jpg
même aux fichiers normaux.
Vous pouvez utiliser renommer:
rename 's/(.*)/$1.jpg/' *
rename from to file...
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:
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 xargs
interne (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...
Simple, cd dans le répertoire où se trouvent vos fichiers et:
for f in *;do mv $f $f.jpg;done
for f in *;do mv "$f" "$f".jpg;done
pour prendre en charge les espaces dans les noms de fichiers.
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.
rename --dry-run * -a ".jpg" # test
* -a ".jpg" # rename
--dry-run
et -a
ne sont pas disponibles dans ma version de rename
. Si cela est spécifique à une architecture, il doit être spécifié.
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
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;
mv "${file}" "${file}.jpg"
?