In einem Verzeichnis befinden sich mehrere Dateien, die mit dem Präfix beginnen fgh
, zum Beispiel:
fghfilea
fghfileb
fghfilec
Ich möchte alle umbenennen, um mit dem Präfix zu beginnen jkl
. Gibt es einen einzigen Befehl, um dies zu tun, anstatt jede Datei einzeln umzubenennen?
file
unix
rename
batch-rename
jww
quelle
quelle
Antworten:
Es gibt verschiedene Möglichkeiten, aber die Verwendung
rename
wird wahrscheinlich die einfachste sein.Verwenden einer Version von
rename
:Verwenden einer anderen Version von
rename
(wie die Antwort von Judy2K ):Sie sollten die Manpage Ihrer Plattform überprüfen, um festzustellen, welche der oben genannten Bedingungen zutrifft.
quelle
rename
als die Syntax für unixhelp.ed.ac.uk/CGI/man-cgi?rename ist die andererename
scheint ein Linux-spezifisches Skript oder Dienstprogramm zu sein. Wenn Sie sich überhaupt für Portabilität interessieren, verwenden Sie weiterhinsed
and-Schleifen oder ein Inline-Perl-Skript.brew install rename
unter OS X :)Dies ist, wie
sed
undmv
kann zusammen verwendet werden, um umzubenennen:Laut Kommentar unten müssen Anführungszeichen, wenn die Dateinamen Leerzeichen enthalten, die Unterfunktion umgeben, die den Namen zurückgibt, um die Dateien zu verschieben:
quelle
for f in fgh*; do mv "$f" "$(echo $f | sed 's/^fgh/jkl/g')"; done
touch fghfilea fghfileb fghfilec fghfile\ d
. Ich schlage freundlicherweise vor, die @ DaveNelson-Bemerkungen zu berücksichtigen.Das Umbenennen ist möglicherweise nicht in jedem System möglich. Wenn Sie es nicht haben, verwenden Sie die Shell in diesem Beispiel in der Bash-Shell
quelle
sed
ist kein Befehl erforderlich. Dieser ist einfacher als die Antwort von @ nik.sh
oder allgemein in anderen Shells nicht vorhanden ist .Mit mmv :
quelle
;
in Verbindung mit#1
. Beispiel:mmv ";fgh*" "#1jkl#2"
Es gibt viele Möglichkeiten, dies zu tun (nicht alle funktionieren auf allen Unixy-Systemen):
ls | cut -c4- | xargs -I§ mv fgh§ jkl§
Der § kann durch alles ersetzt werden, was Sie für zweckmäßig halten. Sie könnten dies auch tun,
find -exec
aber das verhält sich auf vielen Systemen subtil anders, deshalb vermeide ich das normalerweisefor f in fgh*; do mv "$f" "${f/fgh/jkl}";done
Roh aber effektiv wie sie sagen
rename 's/^fgh/jkl/' fgh*
Wirklich hübsch, aber das Umbenennen ist auf BSD, dem am häufigsten verwendeten Unix-System afaik, nicht vorhanden.
rename fgh jkl fgh*
ls | perl -ne 'chomp; next unless -e; $o = $_; s/fgh/jkl/; next if -e; rename $o, $_';
Wenn Sie darauf bestehen, Perl zu verwenden, Ihr System jedoch nicht umbenannt wurde, können Sie dieses Monster verwenden.
Einige davon sind etwas kompliziert und die Liste ist bei weitem nicht vollständig, aber Sie finden hier, was Sie für so ziemlich alle Unix-Systeme wollen.
quelle
ls
Ausgabe nicht analysiert und / oder weitergeleitet werden solltequelle
Unter Verwendung
find
,xargs
undsed
:Es ist komplexer als die Lösung von @ nik , ermöglicht jedoch das rekursive Umbenennen von Dateien. Zum Beispiel die Struktur,
würde dazu transformiert werden,
Der Schlüssel, mit dem es funktioniert,
xargs
ist das Aufrufen der Shell von xargs .quelle
So installieren Sie das Perl- Umbenennungsskript :
Es gibt zwei Umbenennungen, wie in den Kommentaren in der Antwort von Stephan202 erwähnt. Debian-basierte Distributionen haben die Perl-Umbenennung . Redhat / U / min-Distributionen haben die C-Umbenennung .
In OS X ist standardmäßig keine installiert (zumindest in 10.8), Windows / Cygwin auch nicht.
quelle
Hier ist eine Möglichkeit, dies mit der Befehlszeile Groovy zu tun:
quelle
Unter Solaris können Sie Folgendes versuchen:
quelle
for file in $(find)
grundlegend fehlerhaft und können nicht durch Zitieren korrigiert werden. Wennfind
Rückkehr./file name with spaces
werden Sie erhalten einefor
Schleife über./file
,name
,with
, undspaces
und kein Betrag der innerhalb der Schleife unter Angabe helfen (oder sogar notwendig sein).quelle
Dieses Skript funktionierte für mich beim rekursiven Umbenennen mit Verzeichnissen / Dateinamen, die möglicherweise Leerzeichen enthalten:
Beachten Sie den
sed
Ausdruck, der in diesem Beispiel alle Vorkommen von;
durch Leerzeichen ersetzt. Dies sollte natürlich entsprechend den spezifischen Anforderungen ersetzt werden.
quelle
Verwenden von StringSolver- Tools (Windows & Linux Bash), die anhand von Beispielen verarbeitet werden:
Zunächst wird anhand von Beispielen ein Filter berechnet , bei dem die Eingabe die Dateinamen und die Ausgabe sind (ok und notok, beliebige Zeichenfolgen). Wenn der Filter die Option --auto hätte oder nach diesem Befehl alleine aufgerufen würde, würden ein Ordner
ok
und ein Ordner erstelltnotok
und Dateien an diese .Bei Verwendung des Filters ist der
mv
Befehl eine halbautomatische Bewegung, die mit dem Modifikator --auto automatisch wird. Mit dem vorherigen Filter findet er dank --filter eine Zuordnung vonfghfilea
bisjklfilea
und wendet sie dann auf alle gefilterten Dateien an.Andere einzeilige Lösungen
Andere äquivalente Methoden, um dasselbe zu tun (jede Zeile ist äquivalent), sodass Sie Ihre bevorzugte Methode auswählen können.
Mehrstufige Lösung
Um sorgfältig festzustellen, ob die Befehle eine gute Leistung erbringen, können Sie Folgendes eingeben:
und wenn Sie sicher sind, dass der Filter gut ist, führen Sie den ersten Schritt aus:
Wenn Sie den vorherigen Filter testen und verwenden möchten, geben Sie Folgendes ein:
Wenn die Umwandlung nicht Ihren Wünschen entspricht (z. B. auch
mv --explain
wenn Sie feststellen, dass etwas nicht stimmt), können Sie eingeben, um verschobenemv --clear
Dateien neu zu starten, oder weitere Beispiele hinzufügen,mv input1 input2
wobei input1 und input2 andere Beispiele sindWenn Sie sicher sind, geben Sie einfach ein
und voilà! Das Umbenennen erfolgt über den Filter.
HAFTUNGSAUSSCHLUSS: Ich bin Mitautor dieser Arbeit für akademische Zwecke. Möglicherweise wird es bald auch eine Bash-produzierende Funktion geben.
quelle
In Ruby war dies (auf meinem Mac) viel einfacher. Hier sind 2 Beispiele:
quelle
Mit Renamer :
Entfernen Sie das
--dry-run
Flag, wenn Sie zufrieden sind, dass die Ausgabe korrekt aussieht.quelle
Meine Version zum Umbenennen von Massendateien:
quelle
Ich würde empfehlen, mein eigenes Skript zu verwenden, um dieses Problem zu lösen. Es gibt auch Optionen zum Ändern der Codierung der Dateinamen und zum Konvertieren von kombinierten diakritischen Zeichen in vorkomponierte Zeichen, ein Problem, das ich immer habe, wenn ich Dateien von meinem Mac kopiere.
quelle
stale over time
Dies funktionierte bei mir mit regexp:
Ich wollte, dass Dateien wie folgt umbenannt werden:
Verwenden Sie den regulären Ausdruck [az | _] + 0 * ([0-9] +. ), wobei ([0-9] +. ) eine Gruppensubstring ist, die für den Umbenennungsbefehl verwendet werden soll
Produziert:
Ein anderes Beispiel:
Produziert:
Achtung, sei vorsichtig.
quelle
Ich habe dieses Skript geschrieben, um nach allen .mkv-Dateien zu suchen, die gefundene Dateien rekursiv in .avi umbenennen. Sie können es an Ihre Bedürfnisse anpassen. Ich habe einige andere Dinge hinzugefügt, wie das Abrufen des Dateiverzeichnisses, der Erweiterung und des Dateinamens von einem Dateipfad, nur für den Fall, dass Sie in Zukunft auf etwas verweisen müssen.
quelle
Ein generisches Skript zum Ausführen eines
sed
Ausdrucks in einer Liste von Dateien (kombiniert diesed
Lösung mit derrename
Lösung ):Rufen Sie auf, indem Sie dem Skript einen
sed
Ausdruck und dann eine beliebige Liste von Dateien übergeben, genau wie bei einer Version vonrename
:quelle
Sie können auch das folgende Skript verwenden. es ist sehr einfach auf Terminal zu laufen ...
// Mehrere Dateien gleichzeitig umbenennen
Beispiel:-
quelle
Eine weitere mögliche Parametererweiterung :
quelle