Ich benötige einen Befehl, um alle Dateien im aktuellen Arbeitsverzeichnis so umzubenennen, dass der neue Dateiname mit dem alten identisch ist, jedoch ein Suffix enthält, das der Anzahl der Zeilen der Originaldateien entspricht (z. B. wenn die Datei f
10 enthält) Zeilen dann sollte es umbenannt werden f_10
).
Hier ist mein (nicht funktionierender) Versuch:
linenum=$(wc -l); find * -type f | grep -v sh | rename 's/^/ec/'*
bash
batch-rename
Martin Yeboah
quelle
quelle
Antworten:
Wie wäre es mit:
Beispielsweise:
Wenn Sie Erweiterungen behalten möchten (falls vorhanden), verwenden Sie stattdessen Folgendes:
quelle
_
. Was das Drehbuch betrifft, welches Drehbuch? Das sollte von der Kommandozeile ausgeführt werden, es wird kein Skript benötigt. Wenn Sie nur möchten, dass es mit einigen Dateien übereinstimmt, ändern Siein *
zum Beispiel den Wert inin *txt
oder so.wc -l < $f
anstatt des grep wäre es einfacher zu verstehen (und vielleicht besser durchzuführen, aber ich habe das nicht überprüft).wc
, wollte ich einen anderen Ansatz zeigen. Aber okay, fair genug.Sie können diesen einen Liner ausprobieren:
Dies findet alle Dateien im aktuellen Arbeitsverzeichnis (
find . -maxdepth 1 -type f
)Dann führen wir eine Shell-Instanz über die gefundenen Dateien aus, um die Dateien umzubenennen und die Anzahl der Zeilen anzufügen.
Beispiel:
quelle
Ein anderer Weg, um die Erweiterung (falls vorhanden) beizubehalten
rename
:Wenn das Ergebnis das erwartete ist, entfernen Sie die
-n
Option:quelle
rename
great =) +1(\.?[^\.]+)
.(\.?[^\.]+)
nicht in Ordnung, da es nur bis zum zweiten Punkt passt und nicht mit einem Dateinamen mit aufeinanderfolgenden Punkten übereinstimmt oder mit einem Punkt endet. Es ist keine einfache Lösung schwer, der einzige Weg scheint zwei Substitutionen zu machen..
in Zeichenklassen .Verwenden von
find
:Beispiel
quelle
-name "*"
? Reste von Tests? ;)Nur zum Spaß und kichert eine Lösung mit
rename
. Darename
es sich um ein Perl-Tool handelt, das eine beliebige Zeichenfolge akzeptiert, die ausgewertet wird, können Sie alle Arten von Spielereien ausführen. Eine Lösung, die zu funktionieren scheint, ist die folgende:quelle
Das folgende Skript behandelt mehrere Fälle: den einzelnen Punkt und die Erweiterung (file.txt), mehrere Punkte und Erweiterungen (file.1.txt), aufeinanderfolgende Punkte (file..foobar.txt) und Punkte im Dateinamen (file. Or.) Datei..).
Das Drehbuch
Skript in Aktion
Beachten Sie, dass die Datei keine Zeilen enthält. und file .., daher ist die Zeilenzahl 0
Besonderer Dank geht an Terdon und Helio für die Überprüfung des Skripts und die vorgeschlagenen Änderungen
quelle
Ein anderer Bash-Weg, der mit @Helio im Chat entwickelt wurde :
Der seltsam aussehende Monokel-Typ mit einem verkümmerten zweiten Kopf (
(.*)(\.[^.]+)$
) sollte nur zu den richtigen Erweiterungen passen (.foo
, nicht..
) . Wenn es keine Erweiterung gibt, ist dasBASH_REMATCH
Array leer. Wir können dies ausnutzen, indem wir einen Standardwert für den Dateinamen verwenden${BASH_REMATCH[1]:-$file}
und die Erweiterung so verwenden, wie sie ist.Um mit Punktdateien umzugehen , könnten Sie
find
, wie von Terdon und Helio vorgeschlagen, verwenden .quelle