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

12

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

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

Urda
la source
2
Assurons-nous que nous parlons des mêmes choses; quelles sont les sorties de type -a renameet rename --version?
Jeff Schaller
@JeffSchaller C'est plus une curiosité de ma part, mais sur l'une de mes machines * nix que je reçois rename is /usr/bin/renameet rename (util-linux-ng 2.17.2)respectivement.
Urda
6
Il existe plusieurs noms différents , et cela aurait pu être un alias / fonction / script, donc je voulais juste m'assurer que nous savions de quoi il s'agissait. Je vous remercie! N'hésitez pas à modifier ces sorties dans votre question.
Jeff Schaller
@JeffSchaller pas de soucis, en fait, ce lien est celui que je viens de découvrir qui m'a montré renamepeut signifier différentes choses dans différentes distributions.
Urda
5
Il semble que votre question contienne sa réponse. "Quelle est la différence entre un jet et un tricycle, à part le fait qu'un jet peut voler et aller plusieurs milliers de fois plus vite?" :-) ⁠
G-Man dit 'Reinstate Monica'

Réponses:

21

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

mvest un utilitaire standard pour déplacer 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, mvne fonctionne que si la cible est un répertoire et y déplace les fichiers.

Donc , mv foo barva soit déplacer le fichier foodans le répertoire bar(si elle existe), ou renommer fooà bar(si barn'existe pas ou est pas un répertoire). mv foo1 foo2 bardéplacera simplement les deux fichiers dans le répertoire barou se plaindra s'il barne s'agit pas d'un répertoire.

mvappellera la rename()fonction de bibliothèque 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 les originaux.

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


D'un autre côté, les différents renameutilitaires renomment les fichiers individuellement.

Le renamefrom util-linux que vous mentionnez fait une simple substitution de chaîne, par exemple rename foo bar *changerait foobaren barbar, et asdffooen asdfbar. Il ne pas cependant, prendre une expression régulière!

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

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 ne fait pas plus qu'appeler rename()les fichiers, donc passer d'un système de fichiers à un autre ne fonctionne pas.

Quant à ce que renamevous avez, cela 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.

ilkkachu
la source
Non seulement 'expression régulière' mais fonction si besoin
Gilles Quenot
@GillesQuenot, eh bien, vous pourriez par exemple faire rename '$_=lc' *pour les noms de fichiers en minuscules. Mais je pense que le cas le plus courant est d'utiliser s///(que j'ai mentionné) et la partie modèle est une expression régulière; Je ne pense pas que vous puissiez utiliser une fonction là-bas. Vous pouvez cependant le faire dans la pièce de rechange.
ilkkachu
@MyWrathAcademia, Ce premier exemple dans la page de manuel fonctionne pour moi (il fait juste les choses différemment de l'autre). De plus, la raison pour laquelle j'ai lié les pages de manuel de Debian est qu'au moins il est clairement indiqué que la page de manuel pour rename.ulest et sera pour la version util-linux, et pas pour les autres.
ilkkachu
@ilkkachu, cela vous dérange-t-il d'ajouter une explication à ce premier exemple dans votre réponse ou dans un commentaire. Il est différent de l'exemple dans man renamece qu'il serait bon de connaître votre compréhension de l'exemple Debian
MyWrathAcademia
@MyWrathAcademia, je suppose que vous voulez dire l' rename foo foo0 foo?; rename foo foo0 foo??exemple, car c'était la seule différence entre ces deux pages de manuel que j'ai vues. Cette paire de commandes fonctionne parce que la première ajoute un zéro aux noms de chaque nom de fichier à un chiffre, et après cela, la seconde ajoute (une autre) zéro à chaque nom de fichier à deux chiffres. Ce deuxième ensemble comprend les fichiers renommés par la première commande. L'utilisation rename foo foo00 foo?de la première commande fonctionne également, elle ajoute simplement deux zéros à la fois.
ilkkachu
2

mvchange 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. renameest utilisé pour effectuer des changements de nom en masse. Supposons que vous aviez mille fichiers, foo000.logpar foo999.loget que vous vouliez les changer à bar000.logpar le biais bar999.log. Avec mvvous auriez à faire mv foo000.log bar000.log, mv foo001 bar001.logetc. ou d' écrire un autre script. Avec renamevous faites simplement rename foo bar foo*.log, et le tour est joué, mille fichiers sont modifiés en un instant! Plutôt cool. Consultez à man renamenouveau la page pour plus de détails.

eewanco
la source
2

mv

C'est une ligne de commande de base conçue pour faire une chose et bien le faire (philosophie Unix): déplacer des fichiers ou des répertoires .

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

renommer (celui de Perl)

Attention 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 rename, nous pensons à celui-ci, pas à ELFcelui, le 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 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?

n'est pas vraiment conçu pour déplacer des répertoires , 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 *.stackexchange.*sites Web

entrez la description de l'image ici

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

Gilles Quenot
la source
+1 pour sprintfing avec rename
Archemar
-1

mv déplace ou renomme des fichiers et des répertoires et les sauvegarde; renommer renomme simplement les fichiers.

mv a plus de capacités et d'options. Regardez les commutateurs dans les pages de manuel de chacun pour voir les différences de capacités. Jetons un coup d'œil à l'aide de man dans Ubuntu 18.04LTS (votre kilométrage peut varier selon la version de chaque package):

options mv (en omettant l'aide et la version)

   --backup[=CONTROL]  
          make a backup of each existing destination file  

   -b     like --backup but does not accept an argument  

   -f, --force  
          do not prompt before overwriting  

   -i, --interactive  
          prompt before overwrite  

   -n, --no-clobber  
          do not overwrite an existing file  

  If you specify more than one of -i, -f, -n, only the final one takes effect.  

   --strip-trailing-slashes  
          remove any trailing slashes from each SOURCE argument  

   -S, --suffix=SUFFIX  
          override the usual backup suffix  

   -t, --target-directory=DIRECTORY  
          move all SOURCE arguments into DIRECTORY  

   -T, --no-target-directory  
          treat DEST as a normal file  

   -u, --update  
          move only when the SOURCE file is newer than the destination file or when the destination file is missing  

   -v, --verbose  
          explain what is being done  

   -Z, --context  
          set SELinux security context of destination file to default type  

renommer les options (en omettant l'aide et la version)

   -s, --symlink   
          Do not rename a symlink but its target.  

   -v, --verbose  
          Show which files where renamed, if any.  

   -n, --no-act  
          Do not make any changes.  

   -o, --no-overwrite  
          Do not overwrite existing files.            
K7AAY
la source
3
Définissez «plus puissant». Est-ce que mv prend en charge l'expression régulière comme renommer?
Gilles Quenot
Comme l'a dit le questionneur, non.
K7AAY
2
Wow, quel argument
Gilles Quenot
1
Donner du crédit là où le crédit est dû.
K7AAY