Kann jemand vorschlagen, wie der Dateiname umbenannt werden soll:
head.body.date.txt
Zu:
head_body_date.txt
Gibt es eine einzeilige Anweisung zum Umbenennen in Unix ?
Kann jemand vorschlagen, wie der Dateiname umbenannt werden soll:
head.body.date.txt
Zu:
head_body_date.txt
Gibt es eine einzeilige Anweisung zum Umbenennen in Unix ?
.tar.gz
eine Erweiterung ist? Willkommen auch bei U & L!mv head.body.date.txt head_body_date.txt
. Wenn Sie andere Einschränkungen oder echte Beispiele haben, aktualisieren Sie bitte Ihre Frage mit diesen. Derzeit ist unklar, ob sich die Frage auf eine Datei mit diesem expliziten Namen bezieht, auf ein einzelnes Verzeichnis, in dem alle Dateien ein bestimmtes Format haben, oder ob Sie eine Verzeichnishierarchie nach bestimmten Namen durchsuchen und diese ändern möchten.Antworten:
Durchlaufen Sie die Dateinamen und verwenden Sie die Parametererweiterung für die Konvertierung:
Das Parametererweiterungsmuster
${f//./_}
ersetzt alle.
s durch_
s im Dateinamen ($f
).Das obige führt einen Probelauf durch, um das eigentliche Umbenennen zu ermöglichen. Entfernen Sie
echo
:Wenn Sie sich mit einer Erweiterung befassen möchten, nicht nur
.txt
:Nach Überprüfung auf Entfernen
echo
für tatsächliche Aktion:Allgemein, für eine beliebige Anzahl von Punkten mindestens einen:
quelle
for f in *.*; do ...; done
*.*
Muster im Beispiel gerade zu setzen , da der Code jetzt so aussieht, als würde er nur mit einer festen Anzahl von Punkten funktionieren.mit
perl
basiertrename
\.[^.]+$(*SKIP)(*F)
Überspringen Sie dieses Muster und suchen Sie nach alternativen Übereinstimmungen|\./_/g
Ersetzen Sie alle.
durch_
Oder mit negativem Lookahead
Sobald dies in Ordnung ist, entfernen Sie die
-n
Optionquelle
Verwendet die Regex-Ersetzung, um alle bis auf die letzte Instanz
.
im Dateinamen zu finden (nicht erfassender Lookahead) und durch zu ersetzen_
. Verallgemeinert,*.*
wenn Sie möchten.(Diese spezielle Version von
rename
scheint über installiert zu seinutil-linux
). Ich benutzeUbuntu 12.04
(ja, stark veraltete Maschine).quelle
bash
::quelle
mv --
, um sich vor „alten“ Dateinamen zu schützen, die mit beginnen-
. (2) Sie sollten$old
Anführungszeichen ("$old"
) eingeben, um sich vor „alten“ Dateinamen zu schützen, die Leerzeichen oder Zeichen enthalten, die für die Shell besonders sind (wie*
und?
). (3) Ihre Antwort schlägt in dem etwas pathologischen Fall fehl, in dem die Erweiterung einen Unterstrich enthält:head.body.date.t_xt
wird umbenannt inhead_body_date_t.xt
.Unter Verwendung
mv
,sed
undrev
in einer Zeile:Wenn Sie es auf alle
txt
Dateien in der aktuellen Wiederholung anwenden möchten , erscheint die Verwendung von Globs aufgrund der Funktionsweise schwierig.mv
Sie können jedoch einefor
Schleife in einem Einzeiler ausführen :Etwas länger, aber Sie können mehrere Muster in Ihrer Schleife abgleichen!
quelle
$(ls …)
; tu es einfachfor file in *.txt
. (2) Sie sollten mehr Anführungszeichen verwenden :mv "$file" "$(…)"
.rename
klingt die Verwendung, wie einige andere in ihren Antworten vorgeschlagen haben, jedoch einfacher ...Es ist so einfach wie das für jeweils eine Datei. Sie geben nicht an, ob dies rekursiv in einem Verzeichnis oder im gesamten Verzeichnis erfolgen soll, sodass dies die bequemste und schnellste Lösung ist.
quelle