web-dev-qa-db-fra.com

Batch renommer des fichiers

Je veux renommer par lots un certain nombre de fichiers dans un répertoire afin que le numéro précédent et le fichier hypen soient supprimés du nom du fichier.

Old file name: 2904495-XXX_01_xxxx_20130730235001_00000000.NEW
New file name:         XXX_01_xxxx_20130730235001_00000000.NEW

Comment puis-je faire cela avec une commande linux?

18
van

Cela devrait faire:

rename 's/^[0-9]*-//;' *

Il reçoit depuis le début le bloc [0-9] (c'est-à-dire des nombres) plusieurs fois, puis le trait d'union - et le supprime du nom du fichier.


Si rename n'est pas dans votre ordinateur, vous pouvez utiliser une boucle et mv:

mv "$f" "${f#[0-9]*-}"

Tester

$ ls
23-aa  hello aaa23-aa
$ rename 's/^[0-9]*-//;' *
$ ls
aa  hello aaa23-aa

Ou:

$ ls
23-a  aa23-a  hello
$ for f in *;
> do
>   mv "$f" "${f#[0-9]*-}"
> done
$ ls
a  aa23-a  hello
38
fedorqui

Je pense que cette commande serait mieux si vous exécutez la commande ci-dessous: 

ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 mv

Ici 
ls * - répertorie les fichiers du dossier en cours
sed -e - exécute l'expression
p; - affiche l'ancien nom de fichier 
s/ancien-nom/nouveau-nom/- produisant un nouveau nom de fichier 
xargs -n2 - gère deux arguments pour mv
mv - obtient deux paramètres et effectue une opération de déplacement 

Recommandation: avant d'exécuter mv, vérifiez ce que vous voulez faire avec echo .

ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 echo

Exemple suivant renomme 

SCCF099_FG.gz5329223404623884757.tmp à
SCCF099_FG.gz

ls *tmp | sed -e 'p;s/\([0-9]\)\+\.tmp/ /g' | xargs -n2 echo
ls *tmp | sed -e 'p;s/\([0-9]\)\+\.tmp/ /g' | xargs -n2 mv
19
doms

Si les premiers chiffres ont toujours la même longueur:

for F in *new ; do
    mv $F ${F:8}
done

Le ${parameter:number} effectue un développement de sous-chaîne - prend la chaîne à partir du 8ème caractère.

Il existe de nombreuses autres modifications de chaînes disponibles dans les extensions pour traiter d'autres cas.

6
David Souther

Utilisation de renamer (compatible Windows, Mac et Linux):

$ renamer --find '/\d+-(.*)/' --replace '$1' *

Cela supprimera tous les numéros et le premier trait d'union depuis le début de tous les fichiers du répertoire en cours.

3
Lloyd

vimv vous permet de renommer plusieurs fichiers à l'aide des fonctionnalités d'édition de texte de Vim.

La saisie de vimv ouvre une fenêtre Vim qui répertorie tous les fichiers. Vous pouvez effectuer une recherche de modèle, une sélection visuelle, etc. pour modifier les noms. Après avoir quitté Vim, les fichiers seront renommés.

Le fichier screencast du fichier README montre comment il résout la question de l’affiche originale.

[Disclaimer: je suis l'auteur de l'outil]

1
thameera

Cela peut paraître un peu complexe, mais il est assez efficace et fonctionne bien sur les systèmes * nix et OSX. Il agit également de manière récursive en renommant les fichiers du répertoire en cours ainsi que tous les sous-répertoires:

find . -regex '.*/[0-9]\{7\}[-].*' -print > temp1 && \
cp temp1 temp2 && \
vi -c ":g/\([0-9]\{7\}[-]\)\(.*\)/s//\2/" -c ":x" temp2 && \
paste temp1 temp2 > temp3 && \
vi -c ":g/^/s//mv /" -c ":x" temp3 && \
sh ./temp3 && \
rm temp1 temp2 temp3

Voici un aperçu de ce qui vient de se passer:

La première ligne indique de rechercher (find) tous les fichiers, en commençant par ceux du répertoire en cours (.), dont le nom correspond au modèle (-regex) de "7 chiffres, suivi d'un tiret, suivi de 0 caractère ou plus" ('.*/[0-9]\{7\}[-].*' ) et écrivez ces noms de fichiers et leurs chemins respectifs (-print) dans un fichier nommé temp1 (> temp1). Notez que la directive -print n'est probablement pas nécessaire dans la plupart des cas, mais cela ne devrait pas faire de mal.

find . -regex '.*/[0-9]\{7\}[-].*' -print > temp1 && \

Copiez ensuite (cp) le contenu de temp1 dans un fichier nommé temp2.

cp temp1 temp2 && \

Ensuite, ouvrez le fichier temp2 à l'aide de l'éditeur de texte vi et donnez deux commandes vi (utilisez -c pour indiquer chaque nouvelle commande):

  1. Commande n ° 1:
    • Recherchez dans chaque ligne de temp2 _ (:g) le même motif que celui que nous avons recherché ci-dessus, à cette exception près que les résultats sont regroupés à l'aide de parenthèses (\([0-9]\{7\}[-]\)\(.*\)).
    • Pour chaque ligne correspondante, déplacez le curseur là où la correspondance a été trouvée et remplacez toute la correspondance par le deuxième groupe du motif correspondant (\2).
  2. Commande n ° 2:
    • Enregistrez les modifications apportées à temp2 et fermez le fichier (:x).

Le résultat dont étant ceci:

 vi -c ":g/\([0-9]\{7\}[-]\)\(.*\)/s//\2/" -c ":x" temp2 && \

Maintenant, concaténez les lignes de temp1 avec celles de temp2 (paste) et écrivez chaque nouvelle ligne combinée dans un fichier nommé temp3 (> temp3).

paste temp1 temp2 > temp3 && \

Ensuite, exécutez à nouveau vi en procédant de la même manière que ci-dessus, sauf que cette fois, recherchez le début de chaque ligne (^) dans le fichier temp3 et ajoutez mv et un espace juste après (mv).

vi -c ":g/^/s//mv /" -c ":x" temp3 && \

Ensuite, exécutez le contenu de temp3 (./temp3) en tant que script shell (sh).

sh ./temp3 && \

Enfin, supprimez (rm) chacun des fichiers temporaires créés au cours du processus.

rm temp1 temp2 temp3
1
jerdiggity

Il existe également un outil graphique très utile pyRenamerhttps://wiki.ubuntuusers.de/pyRenamer/

1
Pedi T.

J'aime vraiment quelque chose comme "renommer * .mp3 * .mp4".

Mais aucune autre réponse ne me donne ça. J'ai donc écrit un programme haskell pour le faire.

https://hackage.haskell.org/package/batch-rename

Avec cela, vous pouvez faire: batch_rename "DCIM * .jpg" "* .png"

0
Joyer

Vous pouvez utiliser cet outil: rnm

Code pour faire ce que vous voulez:

rnm /path/to/the/directory -fo -dp -1 -rs '/^\d+-//' -ss '^\d+-'

-fo est pour le mode fichier seulement
-dp est la profondeur du répertoire (-1 signifie profondeur illimitée).
-rs est une chaîne de remplacement. \d+- regex est remplacé par une chaîne vide.
-ss est une chaîne de recherche, elle recherche les fichiers avec ^\d+- regex. (Il est toutefois possible de l'omettre, certains messages d'erreur inoffensifs seront imprimés à l'écran).

0
Jahid