web-dev-qa-db-fra.com

Quelle est la différence entre «renommer» et «mv»?

Ce n'est pas tout à fait clair pour moi, mais quelle est la différence entre mv et rename (de util-linux-ng 2.17.2 comme /usr/bin/rename)? Y a-t-il des avantages l'un par rapport à l'autre au-delà de rename en acceptant des expressions régulières et mv pas? Je crois que rename peut également gérer plusieurs renommages de fichiers à la fois, alors que mv ne le fait pas.

Je n'ai pas pu trouver d'indication claire dans leurs pages man ce qui les distingue ou à travers une enquête par moi-même.

12
Urda

C'est essentiellement ce qu'il y a sur le couvercle, pour les deux.

mv est un utilitaire standard to move un ou plusieurs fichiers vers une cible donnée. Il peut être utilisé pour renommer un fichier, s'il n'y a qu'un seul fichier à déplacer. S'il y en a plusieurs, mv ne fonctionne que si la cible est un répertoire et y déplace les fichiers.

Ainsi, mv foo bar Déplacera le fichier foo vers le répertoire bar (s'il existe), ou renommera foo en bar (si bar n'existe pas ou n'est pas un répertoire). mv foo1 foo2 bar Déplacera simplement les deux fichiers dans le répertoire bar, ou se plaindra si bar n'est pas un répertoire.

mv appellera la fonction de bibliothèque rename() C pour déplacer les fichiers, et si cela ne fonctionne pas (ils sont déplacés vers un autre système de fichiers), il copiera les fichiers et supprimera le originaux.

Si tout ce que vous avez est mv et que vous souhaitez renommer plusieurs fichiers, vous devrez utiliser une boucle Shell. Il y a un certain nombre de questions à ce sujet ici sur le site, voir par exemple ce , ce , et autres .


D'un autre côté, les différents utilitaires rename renommer fichiers, individuellement.

Le rename d'util-linux dont vous parlez fait une simple substitution de chaîne, par exemple rename foo bar * Changerait foobar en barbar et asdffoo en asdfbar. Il ne fait pas , cependant, prenez une expression régulière !

L'utilitaire de renommage Perl ( ou diverses instances de celui-ci ) prend une expression Perl pour transformer les noms de fichiers. On utilisera très probablement une commande s/pattern/replacement/, Où le motif est une expression régulière.

Le renommage util-linux et le renommage Perl peuvent être utilisés pour déplacer des fichiers vers un autre répertoire en même temps, en apportant les modifications appropriées au nom du fichier, mais c'est un peu gênant. Il n'y a pas plus que d'appeler rename() sur les fichiers, donc passer d'un système de fichiers à un autre ne fonctionne pas.

Quant à savoir rename que vous avez, il peut dépendre de votre distribution , et/ou de ce que vous avez installé. La plupart d'entre eux prennent en charge rename --version, Alors utilisez-le pour identifier celui que vous avez.

21
ilkkachu

mv

C'est une ligne de commande de base conçue pour faire une chose et bien le faire (philosophie Unix): déplacer le (s) fichier (s) ou directoire (s).

Vous pouvez pirater STDOUT & STDIN¹ pour modifier à la volée la chaîne de destination, mais c'est juste pas un hack intelligent

renommer (celui de Perl)

warning  Il existe d'autres outils portant le même nom qui peuvent ou non être en mesure de le faire, alors soyez prudent.

Quand les gens parlent de rename, on pense à celui-ci, pas à celui de ELF, moins puissant (magique?).

Ce n'est pas basique, c'est Perl. Vous pouvez passer certaines fonctions de Perl à l'intérieur, et c'est extrêmement puissant.

Considérez cet exemple:

Vous voulez renommer un tas de fichiers comme

foobar_1.txt
foobar_2.txt
foobar_3.txt

Vous pouvez ajouter des zéros aux chiffres avec sprintf() comme ceci (en utilisant regex, heh, c'est Perl: D):

rename 's/(\d+)/sprintf("%04d", $1)/e' foobar_*.txt

Maintenant vous avez :

foobar_0001.txt
foobar_0002.txt
foobar_0003.txt

Pas vraiment une commande de base, n'est-ce pas?

renommer n'est pas vraiment conçu pour déplacer dir (s), mais il peut le faire:

$ mkdir -p /tmp/foo/bar/base
$ touch /tmp/foo/bar/base/file
$ rename 's!/tmp/foo/bar/base/file!/tmp/file!' /tmp/foo/bar/base/file

Le fichier déplacé

/tmp/file

¹ du code que nous voyons sur les sites Web de *.stackexchange.*

enter image description here

for FILE in `ls *.txt`
do
    mv ${FILE} `echo ${FILE} | sed 's/anything_ugly/anything_still_ugly/'`
done

Ce n'est pas la voie à suivre , c'est tout simplement un buggy, juste pour expliquer pourquoi utiliser le bon outil au bon moment

2
Gilles Quenot

mv change simplement le nom du fichier (il peut également le déplacer vers un autre système de fichiers ou chemin). Vous lui donnez un ancien nom et un nouveau nom, et il modifie le fichier au nouveau nom ou emplacement. rename est utilisé pour effectuer des changements de nom en masse. Disons que vous aviez mille fichiers, foo000.log par foo999.log et vous vouliez les changer en bar000.log par bar999.log. Avec mv il faudrait faire mv foo000.log bar000.log, mv foo001 bar001.log, etc. ou bien écrivez un script. Avec rename vous faites simplement rename foo bar foo*.log, et le tour est joué, mille fichiers sont modifiés en un instant! Plutôt cool. Vérifiez man rename page à nouveau pour plus de détails.

2
eewanco