Comment renommer plusieurs fichiers en supprimant l'extension?

14

J'ai un certain nombre de fichiers tiff nommés:

sw.001.tif
sw.002.tif
...

et je veux supprimer le .tifà la fin de chacun des fichiers. Comment puis-je utiliser la renamecommande pour ce faire?

Paul
la source
2
Gardez à l'esprit qu'aucun système de fichiers Linux ou Unix n'utilise des "extensions" de style Windows ou VMS - ce n'est que par convention qu'un suffixe du nom de fichier est ".tif" ou ".c" ou ".o" ou ".so " ou peu importe.
Bruce Ediger
C'est bien ... J'importe des fichiers de Windows vers Linux :)
Paul
1
Techniquement parlant, Windows n'utilise pas d'extensions de fichiers non plus, c'est juste que le gestionnaire de fichiers de Windows 95 a continué à utiliser les derniers caractères du nom de fichier pour déterminer le type de fichier après avoir rompu le schéma de nommage MS-DOS et la convention est depuis restée.
RAKK

Réponses:

24

perl« s rename(comme généralement sur Debian où il est aussi appelé prename), ou ce dérivé ( renamepackage sur Debian):

rename 's/\.tif$//' *.tif

util-linux rename(comme on le trouve généralement sur Red Hat, rename.ulsur Debian):

rename -- .tif '' *.tif

(notez que que l' on pourrait renommer blah.tiffany.tifà blahfany.tif)

Ignacio Vazquez-Abrams
la source
2
Je crois que le changement de nom de "Debian" est de Larry Wall (livré avec Perl?) Et celui de "Red Hat" de util-linux (rename.ul dans Debian IIRC).
XTL
@XTL: Vrai. Je les appelle simplement ainsi car ce sont les programmes "renommer" que l'on trouve dans les dérivés Debian ou Red Hat.
Ignacio Vazquez-Abrams
Merci beaucoup! Je n'ai jamais réalisé qu'il existait différentes versions de «renommer». Je suppose qu'il existe d'autres différences subtiles entre les commandes dans debian et redhat. Je vais devoir rechercher certaines de leurs différences.
Paul
La deuxième commande a entraîné une syntaxe non valide, mais la première a fonctionné.
HelloWorld
6

Pour un non-renommage, vous pouvez faire:

$ for i in *.tif; do mv -i $i `basename $i .tif`; done

(-i pour mettre en garde contre le remplacement d'un fichier)

XTL
la source
15
Version plus for i in ./*.tif; do mv -i "$i" "${i%.tif}"; done
sûre et
+1 sur le dernier commentaire ici. C'est plus sûr sur les noms de fichiers avec des espaces vides.
pétobens
1
@ jw013, votre commentaire devrait être une réponse de haut niveau.
Roland
1
rename -- .oldext .newext *.oldext

Cela remplace l'ancienne extension par la nouvelle. Pour supprimer simplement l'extension, vous pouvez explicitement passer une chaîne vide comme argument.

rename -- .gz.tmp  '' *.gz.tmp

Avec la commande ci-dessus, tous les fichiers avec .gz.tmpextension dans le dossier actuel seront renommés filename.gz.

Reportez-vous à l'article: Linux: supprimez les extensions de fichier pour plusieurs fichiers pour plus de détails.

Manpreet Singh
la source
1
Cela suppose que l'implémentation util-linux renameest incompatible avec (et beaucoup plus limitée que) la renamecommande traditionnelle de perl.
Stéphane Chazelas
Notez également qu'il remplace la première occurrence de .oldextdans le nom de fichier, pas nécessairement l'extension ( foo.oldextasy.oldextserait renommée footasy.oldext).
Stéphane Chazelas
1

Si vous utilisez IBM AIX, vous n'aurez pas de renamecommande, donc pour supprimer des extensions de fichier par lots, vous devrez utiliser des commandes UNIX System V simples de vanille:

for file in *.tif; do
   mv $file `echo $file | sed 's/.tif$//'`;
done;
RAKK
la source
-2

pouvons-nous rendre cela récursif

for i in *.gz; do mv -i $i `basename $i .gz`; done
user3361573
la source