Comment renommer facilement plusieurs fichiers à l'aide de la ligne de commande?

103

L’un des moyens de renommer rapidement des fichiers sous Windows est

F2 > Rename > Tab (to next file) > Rename ...

Mais dans Ubuntu / Nautilus, je ne peux pas passer au fichier suivant. Mais étant sous Linux, je pense qu’il doit exister une alternative en ligne de commande.

Cependant, je souhaite parfois plus de contrôle sur la manière de renommer des fichiers spécifiques. Dans ce cas, il est peut-être préférable de pouvoir passer au fichier suivant.

Jiew Meng
la source
1
Pourriez-vous définir "plus de contrôle"? Vous ne savez pas exactement ce que vous demandez ..
Dang Khoa
Je pense que cette question est pas répondu. Ce que vous demandez (F2 puis sautez en mode F2 vers le fichier suivant) n’est pas disponible pour le moment, je pense, dans Nautilus.
don.joey

Réponses:

189

Je l'utilise renametout le temps. C'est assez simple, mais j'espère que vous connaissez la regex de base:

rename "s/SEARCH/REPLACE/g"  *

Cela remplacera la chaîne SEARCHpar REPLACEdans chaque fichier (c'est-à-dire, *). Le /gmoyen global, donc si vous aviez un SEARCH_SEARCH.jpg, il serait renommé REPLACE_REPLACE.jpg. Si vous ne l'aviez pas fait /g, cela n'aurait fait qu'une fois la substitution, et donc maintenant nommée REPLACE_SEARCH.jpg. Si vous voulez /ine pas tenir compte de la casse, ajoutez (ce serait le cas /giou /igà la fin).

Avec les expressions régulières, vous pouvez faire beaucoup plus.

Notez qu'il renames'agit de la commande prename(également appelée Perl rename), qui prend en charge les expressions régulières complètes de Perl. Il y en a un autre renamequi utilise des modèles et qui n'est pas aussi puissant. prenameutilisé pour être installé par défaut sur Ubuntu (avec Perl), mais maintenant vous devrez peut-être faire:

sudo apt install rename

Voici quelques exemples:

Préfixe

Ajouter :

rename 's/^/MyPrefix_/' * 
  • document.pdf renommé en MyPrefix_document.pdf

Supprimer :

Aussi, vous pouvez supprimer les chaînes indésirables. Supposons que vous ayez 20 fichiers MP3 nommés comme CD RIP 01 Song.mp3et que vous vouliez supprimer la partie "CD RIP", et que vous souhaitiez les supprimer avec une seule commande.

rename 's/^CD RIP //' *
  • CD RIP 01 Song.mp3 à 01 Song.mp3

Notez l’espace supplémentaire '^CD RIP ', sans l’espace, tous les fichiers auraient un espace comme premier caractère du fichier. Notez également que cela fonctionnera sans le ^caractère, mais correspondrait CD RIP à n'importe quelle partie du nom de fichier. La ^garantie ne supprime les caractères que s'ils sont au début du fichier.

Suffixe

Ajouter :

rename 's/$/_MySuffix/' *
  • document.pdf renommé en document.pdf_MySuffix

Changement :

rename 's/\.pdf$/.doc/' *

va changer Something.pdfen Something.doc. (La raison de la barre oblique inversée est, .est un caractère générique dans regexp donc .pdfcorrespond qPDFalors que \.pdfne correspond qu'à la chaîne exacte .pdf. Il est également très important de noter que si vous n'êtes pas familier avec BASH, vous devez mettre des barres obliques inverses entre guillemets SIMPLES! Vous ne pouvez pas omettre les guillemets ou utiliser des guillemets doubles ou bash essayera de les traduire. bash \. et "\." égaux .. (mais les guillemets doubles et anti - slash sont utilisés, par exemple « \ n » pour une nouvelle ligne, mais puisque "\."n'est pas une séquence d'échappement arrière valide, traduit en .)

En fait, vous pouvez même inclure les parties de la chaîne entre guillemets au lieu de la totalité: 's/Search/Replace/g'est identique à s/'Search'/'Replace'/get s/Search/Replace/gà BASH. Vous devez juste faire attention aux caractères spéciaux (et aux espaces).


Je suggère d'utiliser l' -noption lorsque vous n'êtes pas sûr d'avoir les expressions régulières correctes. Il montre ce qui serait renommé, puis quitte sans le faire. Par exemple:

rename -n s/'One'/'Two'/g *

Ceci listera tous les changements qu'il aurait apportés si vous n'aviez pas mis le -ndrapeau là-bas. Si le résultat est satisfaisant, appuyez sur Uppour revenir en arrière, puis effacez -net appuyez sur Enter(ou remplacez-le par -vpour afficher toutes les modifications apportées).

Remarque : les versions Ubuntu supérieures à 17.04 ne sont pas livrées avec les renamevaleurs par défaut. Cependant, elles sont toujours disponibles dans les dépôts. Utilisez sudo apt install renamepour l'installer

Mat
la source
Comment vais-je avoir un suffixe "dynamique". Comme 001 - 010 etc. Possible?
Jiew Meng
Hmm .. j'ai essayé d'écrire quelque chose mais ça n'a pas marché. Principalement parce que, quand j'ajoute 1 à 001, cela ajoute à 2, pas à 002. Sinon, je pourrais simplement utiliser varaibles pour tenir la position du numéro, puis l'ajouter. Aussi, je viens juste de me souvenir, avant que je sache à propos de la renamecommande, voici ce que j'ai fait pour annexer:for f in *; do mv -v "$f" "prependThis$f"; done
Matt
2
@jiewmeng Oui. Utilisez (?:\.[0-9]{3})$dans votre modèle, il correspondra à toutes les extensions de fichier à 3 chiffres d'un groupe passif. Exemple: rename s/^my_favorite_movie.avi(?:\.[0-9]{3})$/random_movie.avi/ *. Jetez un oeil à cette feuille de triche regex .
sergio91pt
@ sergio91pt c'est un bon aide-mémoire regex. Mais de quoi s'agit-il? Doit être perl - mais un ne peut pas trouver une telle note là-bas.
Adobe
@Adobe C'est un général pour "regex basé sur perl". Regardez la note sur le signe + et la colonne sur les classes de caractères POSIX.
sergio91pt
21

Essayez pyrenamer .

Ce n'est pas intégré à Nautilus, mais il fait le travail. Voici une critique.

Thunar (partie de XFCE) a également un renameur que vous pouvez exécuter séparément.

Renom de vrac Thunar

RolandiXor
la source
2
merci de mentionner la fonctionnalité Thunar. Si vous avez Thunar - sélectionnez les fichiers dans le dossier et appuyez sur F2.
Max
9

Il semble y avoir un projet sur le tableau de bord appelé Nautilus-Renamer . Vous pouvez l'installer en l'exécutant make installune fois que vous avez téléchargé le script et l'avez désarchivé. Il semble avoir certaines fonctionnalités ou, si vous connaissez certaines programmations, vous pouvez simplement les améliorer selon vos besoins, car il ne s'agit que d'un script Python.

entrez la description de l'image ici

Sagarchalise
la source
8

En ligne de commande, pour renommer un seul fichier, la commande est simplement

mv file1.txt file2.txt

Si vous voulez le faire en batch, vous voudrez probablement le faire via un script. Si vous fournissez plus de détails, moi-même ou quelqu'un d'autre pouvons probablement vous en préparer un. Cela dit, un script pour ajouter des éléments à un fichier pourrait ressembler à ceci:

#!/bin/bash
for file in *
do
    # separate the file name from its extension
    if [[ $file == *.* ]]; then
      ext="${file##*.}"
      fname="${file%.*}"
      mv "$file" "${fname}_APPENDSTUFFHERE.$ext"
    else
      mv "$file" "${file}_APPENDSTUFFHERE"
    fi
done

En fonction de la manière dont vous avez besoin de renommer les éléments, cela sera probablement modifié, par exemple si vous devez suivre des règles de renommage spécifiques. (Personnellement, je le ferais via un script Perl car mon bash-foo n'est pas terrible, mais c'est juste moi.)

Notez que j'ai obtenu la séparation du nom de fichier et de l'extension d' une question posée précédemment .

Dang Khoa
la source
7

Si vous souhaitez le faire sans ligne de commande, comme pour Windows, utilisez la flèche vers la droite au lieu de la touche de tabulation . Ceci sélectionnera le fichier suivant comme le ferait l'onglet sous Windows.

Rafał Cieślak
la source
Ce n'est pas la même chose: vous aurez toujours besoin de ENTER pour finir de renommer, de la touche fléchée pour aller au fichier suivant et de F2 pour le renommer. TAB le fait en 1 étape une fois que vous renommez un fichier.
MestreLion
@MestreLion Mais il est très similaire à l'algorithme décrit dans la question et ne nécessite aucun logiciel supplémentaire ni opérations en ligne de commande. En quelque sorte, facile à utiliser.
Rafał Cieślak
Certes, vous avez été la seule réponse qui a au moins essayé la même approche que la question initiale. Et la triste vérité est que Nautilus n’a pas une telle fonctionnalité. Vous pouvez F2 renommer, mais c'est tout. Pas de tabulation pour passer automatiquement au fichier suivant en mode renommage déjà.
MestreLion
7

Pas vraiment la même question, comment peut-on renommer plusieurs fichiers à la fois? mais je vais suggérer le même programme que j'ai suggéré dans cette réponse: qmv .

qmv est un outil pratique du paquet renameutils. Il vous permet d'utiliser votre éditeur de texte favori pour renommer des fichiers. Combiné à la puissance de vim, vous disposez d'un excellent utilitaire de changement de nom.

Je l’appelle habituellement comme qmv -f dodans le répertoire où je veux renommer un tas de fichiers. Ou si je veux renommer récursivement qmv -R -f do.

Chaque fois que j'ai besoin de renommer plusieurs fichiers, je me rabat toujours sur qmv (et vim).

http://www.nongnu.org/renameutils/

Dempa
la source
Je viens d'essayer cela sur votre suggestion. C'est vraiment l'outil le plus génial si vous utilisez vim!
ste_kwr
3

Si la seule option qui convient consiste à renommer manuellement les fichiers, un excellent moyen de le faire consiste à utiliser vidir(dans le moreutilspackage):

sudo add-apt-repository universe && sudo apt-get update && sudo apt-get install moreutils
DESCRIPTION
       vidir allows editing of the contents of a directory in a text editor.
       If no directory is specified, the current directory is edited.

       When editing a directory, each item in the directory will appear on
       its own numbered line. These numbers are how vidir keeps track of what
       items are changed. Delete lines to remove files from the directory, or
       edit filenames to rename files. You can also switch pairs of numbers
       to swap filenames.

       Note that if "-" is specified as the directory to edit, it reads a
       list of filenames from stdin and displays those for editing.
       Alternatively, a list of files can be specified on the command line.

Exemples


Renommer des fichiers de manière sélective

Contenu du répertoire de travail actuel:

.
├── bar
├── baz
└── foo

Exécuter vidir, renommer les noms de fichiers dans les lignes contenant les noms de fichiers que vous souhaitez renommer; appuyez sur CTRL+ Oet CTRL+ X:

capture d'écran3

.
├── bar.bak
├── baz.old
└── foo.new

Changer de nom de fichier de manière sélective

Contenu du répertoire de travail actuel:

.
├── bar
├── baz
└── foo

Contenu des fichiers du répertoire de travail actuel:

$ for f in *; do printf '- %s:\n\n' "$f"; cat "$f"; echo; done
- bar:

This is bar

- baz:

This is baz

- foo:

This is foo

$ 

Exécuter vidir, permutez les nombres dans les lignes contenant les noms de fichiers que vous voulez changer; appuyez sur CTRL+ Oet CTRL+ X:

capture d'écran4

.
├── bar
├── baz
└── foo
$ for f in *; do printf '- %s:\n\n' "$f"; cat "$f"; echo; done
- bar:

This is foo

- baz:

This is bar

- foo:

This is baz

$ 

Suppression sélective de fichiers

Contenu du répertoire de travail actuel:

.
├── bar
├── baz
└── foo

Exécuter vidir, supprimez les lignes contenant les fichiers que vous souhaitez supprimer; appuyez sur CTRL+ Oet CTRL+ X:

capture d'écran2

.
└── baz
kos
la source
2

J'utilise krename. C'est une application graphique. Il pourrait lire les balises mp3 et ainsi de suite.

Il existe en tant qu'application distincte et fait partie de Krusader.

Il y a aussi un renamescript - qui fait partie de l'installation standard de Perl (vous l'avez probablement déjà installé). Vérifiez avec man rename.

Adobe
la source