web-dev-qa-db-fra.com

Comment renommer des fichiers en ignorant l'extension de fichier dans le terminal?

J'ai plusieurs dossiers de fichiers vidéo qui doivent être renommés en quelque chose d'uniforme, par exemple: foldername.videotypexvideonumber.avi. J'ai envisagé de créer un script Shell pour rendre cela plus facile. La commande mv semble être la meilleure façon de procéder.

Cependant, chaque guide/tutoriel/page de manuel que j'ai vu dit que lorsque je renomme un fichier, je dois également inclure l'extension du fichier. Ce serait normalement bien, mais certains dossiers contiennent des vidéos de plusieurs types de fichiers, par exemple .mkv et .avi et même certains fichiers .rmvb.

Donc, ce que je dois savoir, c'est s'il existe un moyen de renommer les fichiers via le terminal sans avoir à spécifier le type de fichier lors de cette opération - essentiellement pour que l'extension reste la même, quelle qu'elle soit avant de renommer.

2
Saladin Akara

Réponse rapide:

Vous ne pouvez pas faire cela car les extensions font partie du nom de fichier.

Réponse longue:

Vous pouvez utiliser une interface graphique pour effectuer des renommages avancés comme purrr ou gprename

MAIS!

Dans votre script de renommage par lots, vous pouvez utiliser les techniques suivantes de fractionnement de nom de fichier:

FULLFILENAME="/home/user/video/myvideo-release.xvid.128kbps.avi"
DIRNAME=$(dirname ${FULLFILENAME})   #-- /home/user/video
BASENAME=$(basename ${FULLFILENAME}) #-- myvideo-release.xvid.128kbps.avi
FILENAME=${BASENAME%.*}              #-- myvideo-release.xvid.128kbps
EXTENSION=${BASENAME##*.}            #-- avi
1
Lin

Il serait utile de savoir exactement ce que vous voulez faire, mais vous pouvez certainement le faire. Connaître expansion des paramètres BASH est probablement assez nécessaire.

Selon ce que vous devez faire, vous devrez peut-être séparer l'extension et le nom de fichier, ou peut-être pas.

Je vais supposer que vous avez déjà cded dans le dossier avec les fichiers en question.

cas 1: supposons que vous souhaitiez remplacer la chaîne "bad" par "good" dans chaque nom de fichier; alors vous pouvez utiliser une simple substitution, c'est-à-dire que vous pouvez faire quelque chose comme:

for file in * ; do mv "$file" "${file//bad/good}" ; done

(Assurez-vous qu'il n'y a pas de changement, le fait de changer de mauvais en bon remplacera quelque chose déjà là.) Cela fonctionnera quelle que soit l'extension.

cas 2: Supposons que vous devez ajouter "nouveau" avant l'extension, quelle qu'elle soit, alors vous pouvez faire:

for file in * ; do filename="${file%.*}" ; extension="${file##*.}" ; mv "$file" "${filename}new.${extension}" ; done

L'extension restera la même, quelle qu'elle soit.

Je donnerais plus de conseils, mais encore une fois, je ne sais vraiment pas ce que vous essayez de faire, exactement.

1
frabjous
[temp] λ = ls
test.doc  test.rtf  test.txt
[temp] λ = for f in *; do mv "$f" test2`echo "$f" | sed 's/[^.]*//'`; done
[temp] λ = ls
test2.doc  test2.rtf  test2.txt

Il pourrait y avoir une façon plus élégante de le faire, mais cela fonctionne

Remplacez test2 par tout ce que vous voulez un compteur ou quelque chose.

0
nvm