Was ist der Unterschied zwischen 'umbenennen' und 'mv'?

12

Es ist mir nicht ganz klar, aber was ist der Unterschied zwischen mvund rename(von util-linux-ng 2.17.2as /usr/bin/rename)? Gibt es Vorteile gegenüber dem anderen rename, als reguläre Ausdrücke zu akzeptieren, und mvnicht? Ich glaube, dass renameauch mehrere Umbenennungen von Dateien gleichzeitig möglich sind, während mvdies nicht der Fall ist.

Ich konnte auf ihren manSeiten keinen klaren Hinweis darauf finden, was sie sonst noch auszeichnet, oder durch eine Untersuchung allein.

Urda
quelle
2
Stellen wir sicher, dass wir über die gleichen Dinge sprechen. Was sind die Ausgänge von type -a renameund rename --version?
Jeff Schaller
@JeffSchaller Es ist eher eine Kuriosität für meinen Teil, aber auf einem meiner * nix Maschinen , die ich bekommen rename is /usr/bin/renameund rename (util-linux-ng 2.17.2)jeweils.
Urda
6
Es gibt einige verschiedene Umbenennungen , und es könnte sich um einen Alias ​​/ eine Funktion / ein Skript handeln. Deshalb wollte ich nur sicherstellen, dass wir wissen, was es ist. Vielen Dank! Bitte zögern Sie nicht, diese Ausgaben in Ihrer Frage zu bearbeiten.
Jeff Schaller
@ JeffSchaller keine Sorge, eigentlich war dieser Link einer, den ich gerade gefunden habe und der mir gezeigt hat, dass er renamein verschiedenen Distributionen verschiedene Dinge bedeuten kann.
Urda
5
Es scheint, als ob Ihre Frage ihre Antwort enthält. "Was ist der Unterschied zwischen einem Jet und einem Dreirad, abgesehen von der Tatsache, dass ein Jet fliegen und mehrere tausend Mal schneller fliegen kann?" :-) ⁠
G-Man sagt 'Reinstate Monica'

Antworten:

21

Es ist im Grunde das, was auf dem Deckel steht, für beide.

mvist ein Standarddienstprogramm zum Verschieben einer oder mehrerer Dateien auf ein bestimmtes Ziel. Es kann zum Umbenennen einer Datei verwendet werden, wenn nur eine Datei verschoben werden muss. Wenn mehrere vorhanden sind, mvfunktioniert dies nur, wenn das Ziel ein Verzeichnis ist, und verschiebt die Dateien dorthin.

mv foo barVerschiebt die Datei also entweder fooin das Verzeichnis bar(falls vorhanden) oder umbenannt fooin bar(falls barnicht vorhanden oder kein Verzeichnis). mv foo1 foo2 barVerschiebt einfach beide Dateien in das Verzeichnis baroder beschwert sich, wenn bares sich nicht um ein Verzeichnis handelt.

mvRuft die rename()C-Bibliotheksfunktion auf, um die Dateien zu verschieben. Wenn dies nicht funktioniert (sie werden in ein anderes Dateisystem verschoben), werden die Dateien kopiert und die Originale entfernt.

Wenn Sie nur mvmehrere Dateien umbenennen möchten, müssen Sie eine Shell-Schleife verwenden. Es gibt eine Reihe von Fragen auf , die hier auf der Website, siehe zB diese , diese , und andere .


Andererseits benennen die verschiedenen renameDienstprogramme Dateien einzeln um.

Das renamevon util-linux, das Sie erwähnen, führt eine einfache Zeichenfolgenersetzung durch, z. B. rename foo bar *würde sich foobarzu barbarund asdffoozu ändern asdfbar. Es ist nicht , jedoch einen regulären Ausdruck!

Das Perl-Umbenennungsdienstprogramm ( oder verschiedene Instanzen davon ) verwendet einen Perl-Ausdruck, um die Dateinamen zu transformieren. Man wird höchstwahrscheinlich einen verwenden Befehl ein , wobei das Muster ist ein regulärer Ausdruck.s/pattern/replacement/

Sowohl die Umbenennung von util-linux als auch die Umbenennung von Perl können verwendet werden, um Dateien gleichzeitig in ein anderes Verzeichnis zu verschieben, indem entsprechende Änderungen am Dateinamen vorgenommen werden. Dies ist jedoch etwas umständlich. Es werden auch nicht mehr als rename()die Dateien aufgerufen , sodass das Wechseln von einem Dateisystem zu einem anderen nicht funktioniert.

Was renameSie haben, kann von Ihrer Distribution und / oder dem, was Sie installiert haben, abhängen . Die meisten von ihnen unterstützen rename --versiondies. Verwenden Sie diese Option , um festzustellen, welche Sie haben.

ilkkachu
quelle
Nicht nur 'regulärer Ausdruck', sondern Funktion, wenn nötig
Gilles Quenot
@ GillesQuenot, na ja, Sie könnten z rename '$_=lc' *. B. Dateinamen in Kleinbuchstaben schreiben. Aber ich denke, der häufigste Fall ist die Verwendung s///(was ich erwähnt habe) und der Musterteil davon ist ein Regex; Ich glaube nicht, dass Sie dort eine Funktion verwenden können. Sie können dies jedoch im Ersatzteil tun.
Ilkkachu
@MyWrathAcademia, das erste Beispiel in der Manpage funktioniert für mich (es macht die Dinge einfach anders als das andere). Der Grund, warum ich auf Debians Manpages verlinkt habe, ist, dass zumindest dort sehr deutlich gemacht wurde, dass die Manpage rename.ulfür die Util-Linux-Version ist und sein wird und nicht für eine der anderen.
Ilkkachu
@ilkkachu, macht es Ihnen etwas aus, diesem ersten Beispiel entweder in Ihrer Antwort oder in einem Kommentar eine Erklärung hinzuzufügen? Es unterscheidet sich von dem Beispiel in, man renamedaher wäre es gut zu wissen, wie Sie das Debian-Beispiel verstehen
MyWrathAcademia
@MyWrathAcademia, ich nahm an, Sie meinen das rename foo foo0 foo?; rename foo foo0 foo??Beispiel, da dies der einzige Unterschied zwischen diesen beiden Manpages war, die ich gesehen habe. Dieses Befehlspaar funktioniert, weil der erste den Namen jedes einstelligen Dateinamens eine Null hinzufügt und der zweite danach jedem zweistelligen Dateinamen eine (weitere) Null hinzufügt. Dieser zweite Satz enthält die Dateien, die mit dem ersten Befehl umbenannt wurden. Wenn rename foo foo00 foo?der erste Befehl ebenfalls funktioniert, werden nur zwei Nullen auf einmal hinzugefügt.
Ilkkachu
2

mvÄndert einfach den Namen der Datei (sie kann auch in ein anderes Dateisystem oder einen anderen Pfad verschoben werden). Sie geben ihm einen alten und einen neuen Namen und es ändert die Datei in den neuen Namen oder Speicherort. renamewird verwendet, um Änderungen an der Bulk-Benennung vorzunehmen. Angenommen, Sie hatten tausend Dateien foo000.logdurch foo999.logund wollten sie in bar000.logdurch ändern bar999.log. Mit mvIhnen zu tun haben würde mv foo000.log bar000.log, mv foo001 bar001.logusw. oder auch ein Skript schreiben. Mit renameman einfach tun rename foo bar foo*.log, und voila, sind tausend Dateien in einem Augenblick verändert! Ziemlich cool. Überprüfen Sie die man renameSeite erneut für Details.

eewanco
quelle
2

mv

Es ist eine grundlegende Befehlszeile, die entwickelt wurde, um eine Sache zu erledigen und sie gut zu machen (Unix-Philosophie): Datei (en) oder Verzeichnis (e) verschieben .

Sie können STDOUT& STDIN¹ hacken , um die Zielzeichenfolge im laufenden Betrieb zu ändern, aber es ist einfach kein intelligenter Hack

umbenennen (Perls)

Warnung Es gibt andere Tools mit demselben Namen, die dies möglicherweise können oder nicht. Seien Sie also vorsichtig.

Wenn Leute darüber reden rename, denken wir an diesen, nicht an den ELF, der weniger mächtig ist (Magie?).

Es ist nicht einfach, es ist Perl. Sie können einige Perl-Funktionen im Inneren übergeben, und es ist extrem leistungsfähig.

Betrachten Sie dieses Beispiel:

Sie möchten eine Reihe von Dateien wie umbenennen

foobar_1.txt
foobar_2.txt
foobar_3.txt

Sie können den Ziffern sprintf()wie folgt Nullen voranstellen (mit Regex, heh, es ist Perl: D):

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

Jetzt hast du :

foobar_0001.txt
foobar_0002.txt
foobar_0003.txt

Nicht wirklich ein grundlegender Befehl, nicht wahr?

ist nicht wirklich zum Verschieben von Verzeichnissen gedacht, kann es aber:

$ 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

Die verschobene Datei

/tmp/file

¹ Code, den wir auf *.stackexchange.*Websites sehen

Geben Sie hier die Bildbeschreibung ein

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

Es ist nicht der richtige Weg , es ist einfach fehlerhaft, nur um zu erklären, warum das richtige Werkzeug im richtigen Moment verwendet wird

Gilles Quenot
quelle
+1 für die sprintfUmbenennung
Archemar
-1

mv verschiebt oder benennt Dateien und Verzeichnisse um und sichert sie; Umbenennen benennt nur Dateien um.

mv bietet mehr Funktionen und Optionen. Sehen Sie sich die Schalter in den Manpages an, um die Unterschiede in den Funktionen zu erkennen. Werfen wir einen Blick auf man in Ubuntu 18.04LTS (Ihr Kilometerstand kann je nach Version jedes Pakets variieren):

MV-Optionen (ohne Hilfe und 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  

Optionen umbenennen (Hilfe und Version weglassen)

   -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
quelle
3
Definieren Sie "mächtiger". Unterstützt mv Regex wie das Umbenennen?
Gilles Quenot
Wie der Fragesteller feststellte, nein.
K7AAY
2
Wow, was für ein Argument
Gilles Quenot
1
Kredit geben, wo Kredit fällig ist.
K7AAY