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.
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.
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
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
/tmp/file
¹ du code que nous voyons sur les sites Web de *.stackexchange.*
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
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.