Benennen Sie alle Dateien in einem Ordner mit einem Präfix in einem einzigen Befehl um


Antworten:


104

Wenn Ihre Dateinamen kein Leerzeichen enthalten und Sie keine Unterverzeichnisse haben, können Sie eine einfache forSchleife verwenden:

$ for FILENAME in *; do mv $FILENAME Unix_$FILENAME; done 

Verwenden Sie andernfalls den praktischen renameBefehl (ein Perl-Skript) - obwohl er möglicherweise nicht unter jedem Unix sofort verfügbar ist (z. B. wird OS X nicht mitgeliefert rename).

Ein kurzer Überblick unter debian-administration.org:

Wenn Ihre Dateinamen Leerzeichen enthalten, ist die Verwendung findunter Linux einfacher : Folgendes sollte funktionieren:

$ find . -type f -name '*' -printf "echo mv '%h/%f' '%h/Unix_%f\n'" | sh

Auf BSD-Systemen gibt es -printfleider keine Option. Aber GNU findutils sollte (zB auf Mac OS X mit installierbar sein brew install findutils).

$ gfind . -type f -name '*' -printf "mv \"%h/%f\" \"%h/Unix_%f\"\n" | sh

@Matteo: Danke an den Hinweis: Aktualisierte meine Antwort mit einer Warnung plus zwei Beispielen mit find.
Miku

Würde auch empfehlen for f in *; do [[ -f ${f} ]] && mv ...; done, nur Dateien
abzufangen

1
Wenn Sie Variablen wie angegeben zitieren, for FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; donefunktioniert dies unabhängig davon, welche Zeichen in den Dateinamen enthalten sind. Es werden auch Verzeichnisse, Sockets, Symlinks und andere Dateitypen verschoben. Ich nehme an, das spielt keine Rolle.
Jonathan Leffler

75

Versuchen Sie den renameBefehl im Ordner mit den Dateien :

rename 's/^/Unix_/' *

Das Argument der Umbenennung ( Befehl sed s ) gibt an, dass der reguläre Ausdruck ^ durch Unix_ ersetzt werden soll . Das Caret (^) ist ein Sonderzeichen, das den Zeilenanfang bedeutet .


8
Können Sie erklären, was 's/^/.../'bedeutet?
mcont

@ Matto 's/^/.../'ist das Perl-Ausdrucksargument für den Umbenennungsbefehl
RoyalleBlue

das ist fantastisch! Ich würde vorschlagen, Ordner / * hinzuzufügen, weil * ein bisschen gefährlich ist, wenn der Befehl versehentlich an einer anderen Stelle wiederholt wird
Systems Rebooter

Brew Install Umbenennen @OliverPearmain
Felipe Plazas

Beispiel zum Ersetzen eines Präfixes:rename 's/^start_/run_' *
DenisKolodin

31

Ich denke, das ist genau das, wonach Sie suchen:

ls | xargs -I {} mv {} Unix_{}

Ja, es ist einfach, aber elegant und kraftvoll und auch einzeilig. Eine ausführlichere Einführung erhalten Sie von mir auf der Seite: Dateien und Verzeichnisse umbenennen (Präfix hinzufügen)


1
Achten Sie darauf, dass Sie die Ausgabe von nicht verarbeiten ls. Dies kann zu Problemen führen, wenn die Dateinamen Leerzeichen oder andere merkwürdige Zeichen enthalten.
Jonathan Leffler

15

Ich war kürzlich mit der gleichen Situation konfrontiert und fand eine einfachere eingebaute Lösung. Ich teile es hier, damit es anderen Menschen helfen kann, nach einer Lösung zu suchen.

Mit OS X Yosemite hat Apple die Batch-Umbenennungsfunktionen direkt in Finder integriert. Details finden Sie hier . Ich habe auch die folgenden Schritte kopiert,

Benennen Sie mehrere Elemente um

  1. Wählen Sie die Elemente aus und klicken Sie bei gedrückter Ctrl-Taste auf eines davon.

  2. Wählen Sie im Kontextmenü die Option Elemente umbenennen.

  3. Wählen Sie im Popup-Menü unter Ordnerelemente umbenennen, ob Sie Text in den Namen ersetzen, den Namen Text hinzufügen oder das Namensformat ändern möchten.

    • Text ersetzen: Geben Sie den zu entfernenden Text in das Feld Suchen ein und geben Sie den Text, den Sie hinzufügen möchten, in das Feld Ersetzen durch ein.

    • Text hinzufügen: Geben Sie den Text, den Sie hinzufügen möchten, in das Feld ein und fügen Sie den Text vor oder nach dem aktuellen Namen hinzu.

    • Format: Wählen Sie ein Namensformat für die Dateien und setzen Sie dann den Index, den Zähler oder das Datum vor oder nach dem Namen. Geben Sie einen Namen in das Feld Benutzerdefiniertes Format ein und geben Sie dann die Nummer ein, mit der Sie beginnen möchten.

  4. Klicken Sie auf Umbenennen.

Wenn Ihre Dateien ein gemeinsames Muster haben, können Sie Text ersetzen verwenden, andernfalls würde auch das Hinzufügen von Text die Aufgabe übernehmen.


Ausgezeichnet - hat mir viel Zeit gespart!
user3000868

6

Sie können einfach -ianstelle von verwenden-I {}

ls | xargs -i mv {} unix_{}

Das funktioniert auch perfekt.

  • ls - listet alle Dateien im Verzeichnis auf
  • xargs- akzeptiert aufgrund der -iOption alle Dateien zeilenweise
  • {}ist der Platzhalter für alle Dateien, der erforderlich ist, wenn xargsmehr als zwei Argumente als Eingabe abgerufen werden

Mit awk:

ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh

-iist veraltet, jetzt ist nur-I
JamPow

es hat mir auf Debian 8 geholfen. Thaks
Abror Esonaliyev

2

Funktioniert auch für Elemente mit Leerzeichen und ignoriert Verzeichnisse

for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done

1

Mit rnm (Sie müssen es installieren):

rnm -ns 'Unix_/fn/' *

Oder

rnm -rs '/^/Unix_/' *

PS: Ich bin der Autor dieses Tools.


2
Sie sollten alle Ihre Antworten zu Ihrem Dienstprogramm durchgehen und den Haftungsausschluss hinzufügen, dass Sie dessen Autor sind.
Mogsdad

@Mogsdad: Ich denke nicht, dass es sich um eine notwendige Information handelt. Wenn jemand den Autor finden will, ist es ziemlich einfach.
Jahid

Vielen Dank für dieses Tool. Aus irgendeinem Grund renamefunktioniert das bei mir nicht, rnmtut es aber .
Aloso

0

Lage:

Wir haben certificate.key certificate.crtdrinnen/user/ssl/

Wir wollen etwas umbenennen , die mit beginnt certificatezucertificate_OLD

Wir befinden uns jetzt im Inneren /user

Zuerst machst du einen Trockenlauf mit -n:

rename -n "s/certificate/certificate_old/" ./ssl/*

Welches kehrt zurück:

rename(./ssl/certificate.crt, ./ssl/certificate_OLD.crt) rename(./ssl/certificate.key, ./ssl/certificate_OLD.key)

Ihre Dateien bleiben unverändert. Dies ist nur ein Testlauf.

Lösung:

Wenn Sie mit dem Ergebnis des Tests zufrieden sind, führen Sie es wirklich aus:

rename "s/certificate/certificate_OLD/" ./ssl/*

Was es bedeutet:

`benenne" s / SOMETHING / SOMETING_ELSE "PATH / FILES um

Trinkgeld:

Wenn Sie bereits auf dem Pfad sind, führen Sie es folgendermaßen aus:

rename "s/certificate/certificate_OLD/" *

Oder wenn Sie dies in einem Unterverzeichnis tun möchten, das mit ssdo beginnt :

rename -n "s/certificat/certificate_old/" ./ss*/*

Sie können auch tun:

rename -n "s/certi*/certificate_old/" ./ss*/*

Womit alles umbenannt wird, was certiin einem Unterverzeichnis beginnt, das mit beginnt ss.

Der Himmel ist die Grenze.

Spielen Sie mit Regex herum und testen Sie dies IMMER VORHER mit -n.

Achten Sie darauf, dass die Namen der Ordner sogar umbenannt werden. Bessercd ins Verzeichnis und mach es dort. VERWENDUNG AUF EIGENE GEFAHR.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.