Wie kann Bash eine Reihe von Paketen umbenennen, um deren Versionsnummern zu entfernen? Ich habe mit beiden herumgespielt expr
und %%
ohne Erfolg.
Beispiele:
Xft2-2.1.13.pkg
wird Xft2.pkg
jasper-1.900.1.pkg
wird jasper.pkg
xorg-libXrandr-1.2.3.pkg
wird xorg-libXrandr.pkg
bash
shell
file-rename
Jeremy L.
quelle
quelle
Antworten:
Sie können die Parametererweiterungsfunktion von bash verwenden
Für Dateinamen mit Leerzeichen werden Anführungszeichen benötigt.
quelle
rename "s/-[0-9.]*//" *.pkg
Wenn sich alle Dateien im selben Verzeichnis befinden, die Reihenfolge
wird deinen Job machen. Der Befehl sed erstellt eine Folge von mv- Befehlen, die Sie dann in die Shell weiterleiten können. Führen Sie die Pipeline am besten zuerst ohne Nachlauf aus
| sh
, um zu überprüfen, ob der Befehl das tut, was Sie möchten.Um mehrere Verzeichnisse zu durchsuchen, verwenden Sie so etwas wie
Beachten Sie, dass in sed die Gruppierungssequenz für reguläre Ausdrücke Klammern ist, denen ein Backslash vorangestellt ist,
\(
und\)
nicht einzelne Klammern(
und)
.quelle
ls
in Skripten verwenden. Die erste Sorte kann mitprintf '%s\n' * | sed ...
und mit etwas Kreativität erreicht werden, die Sie wahrscheinlich auch loswerden könnensed
. Bash'sprintf
bietet einen'%q'
Formatcode, der nützlich sein kann, wenn Sie Dateinamen haben, die wörtliche Shell-Metazeichen enthalten.Ich mache so etwas:
Angenommen, alle Ihre Dateien befinden sich im aktuellen Verzeichnis. Wenn nicht, versuchen Sie, find wie oben von Javier empfohlen zu verwenden.
BEARBEITEN : Außerdem verwendet diese Version keine Bash-spezifischen Funktionen wie die oben genannten, was zu mehr Portabilität führt.
quelle
Hier ist ein POSIX, das der aktuell akzeptierten Antwort nahezu entspricht . Dadurch wird die Nur-Bash-
${variable/substring/replacement}
Parametererweiterung gegen eine ausgetauscht, die in jeder Bourne-kompatiblen Shell verfügbar ist.Die Parametererweiterung
${variable%pattern}
erzeugt den Wert vonvariable
mit einem Suffix, das mitpattern
entfernt übereinstimmt . (Es gibt auch${variable#pattern}
ein Präfix zu entfernen.)Ich habe das Untermuster
-[0-9.]*
von der akzeptierten Antwort ferngehalten , obwohl es vielleicht irreführend ist. Es ist kein regulärer Ausdruck, sondern ein Globusmuster. es bedeutet also nicht "ein Bindestrich gefolgt von null oder mehr Zahlen oder Punkten". Stattdessen bedeutet es "ein Bindestrich, gefolgt von einer Zahl oder einem Punkt, gefolgt von irgendetwas". Das "irgendetwas" wird das kürzestmögliche Spiel sein, nicht das längste. (Bash-Angebote##
und%%
zum Trimmen des längstmöglichen Präfixes oder Suffixes anstelle des kürzesten.)quelle
Wir können davon ausgehen, dass
sed
es auf jedem * nix verfügbar ist, aber wir können nicht sicher sein, ob essed -n
das Generieren von mv-Befehlen unterstützt. ( HINWEIS:sed
Dies wird nur von GNU durchgeführt .)Trotzdem können wir schnell eine Shell-Funktion entwickeln, um dies zu tun.
Verwendung
Zielordner erstellen:
Da
mv
Zielordner nicht automatisch erstellt werden, können wir unsere ursprüngliche Version von nicht verwendensedrename
.Es ist eine ziemlich kleine Änderung, daher wäre es schön, diese Funktion aufzunehmen:
Wir benötigen eine Utility-Funktion
abspath
(oder einen absoluten Pfad), da bash diese Funktion nicht integriert hat.Sobald wir das haben, können wir die Zielordner für ein sed / rename-Muster generieren, das eine neue Ordnerstruktur enthält.
Dadurch wird sichergestellt, dass wir die Namen unserer Zielordner kennen. Wenn wir umbenennen, müssen wir es für den Namen der Zieldatei verwenden.
Hier ist das vollständige Ordner-fähige Skript ...
Natürlich funktioniert es immer noch, wenn wir keine spezifischen Zielordner haben.
Wenn wir alle Songs in einen Ordner legen wollten, können
./Beethoven/
wir dies tun:Verwendung
Bonusrunde ...
Verwenden dieses Skripts zum Verschieben von Dateien aus Ordnern in einen einzelnen Ordner:
Angenommen, wir wollten alle übereinstimmenden Dateien sammeln und im aktuellen Ordner ablegen, dann können wir Folgendes tun:
Hinweis zu sed regex-Mustern
In diesem Skript gelten die Regeln für reguläre sed-Muster. Diese Muster sind keine PCRE (Perl Compatible Regular Expressions). Sie hätten die erweiterte Syntax für reguläre Ausdrücke entweder
sed -r
odersed -E
abhängig von Ihrer Plattform verwenden können.man re_format
Eine vollständige Beschreibung der sed-Basis- und erweiterten Regexp-Muster finden Sie in der POSIX-Konformität .quelle
Ich finde, dass das Umbenennen ein viel einfacheres Werkzeug für solche Dinge ist. Ich habe es auf Homebrew für OSX gefunden
Für Ihr Beispiel würde ich tun:
Das 's' bedeutet Ersatz. Das Formular lautet s / searchPattern / replace / files_to_apply. Sie müssen dafür Regex verwenden, was ein wenig Studium erfordert, aber die Mühe lohnt sich.
quelle
for
undsed
usw. ist in Ordnung, aber es ist viel einfacher und schneller zu nur nutzen ,rename
wenn Sie sich diese oft finden zu tun.rename
Befehl haben. Darüber hinaus verfügen einige über einen anderenrename
Befehl mit unterschiedlichen Funktionen, Syntax und / oder Optionen. Dies sieht aus wie das Perl,rename
das ziemlich beliebt ist; aber die Antwort sollte dies wirklich klarstellen.Bessere Verwendung
sed
dafür, so etwas wie:Das Herausfinden des regulären Ausdrucks bleibt als Übung (ebenso wie der Umgang mit Dateinamen, die Leerzeichen enthalten).
quelle
Dies scheint unter der Annahme zu funktionieren
.pkg abstreifen, dann abstreifen - ..
quelle
-e
. ZBsed -e 's/\.pkg//g' -e 's/-.*//g'
.ls
Ausgabe nicht und zitieren Sie Ihre Variablen nicht. Siehe auch shellcheck.net zur Diagnose häufiger Probleme und Antimuster in Shell-Skripten.Ich musste mehrere
*.txt
Dateien wie.sql
im selben Ordner umbenennen . unten arbeitete für mich:quelle
Vielen Dank für diese Antworten. Ich hatte auch ein Problem. Verschieben von .nzb.queued-Dateien in .nzb-Dateien. Es hatte Leerzeichen und andere Cruft in den Dateinamen und dies löste mein Problem:
Es basiert auf der Antwort von Diomidis Spinellis.
Der reguläre Ausdruck erstellt eine Gruppe für den gesamten Dateinamen und eine Gruppe für den Teil vor .nzb.queued und erstellt dann einen Shell-Verschiebungsbefehl. Mit den angegebenen Zeichenfolgen. Dadurch wird auch vermieden, dass eine Schleife im Shell-Skript erstellt wird, da dies bereits von sed ausgeführt wird.
quelle
-n
Option nicht auf die gleiche Weise.