Ich habe das Unglück, aus einem MS-DOS-Hintergrund zu kommen - aber zumindest weiß ich zu schätzen, wie viel leistungsfähiger Linux ist. Ich habe daran gearbeitet, mein Linux-Fu auf den neuesten Stand zu bringen, aber es gibt einige Dinge, die mit DOS erledigt werden könnten, und ich bin mir nicht sicher, wie ich es mit Linux am einfachsten erreichen kann :
Umbenennen mehrerer Dateien - Verwenden von zwei Platzhaltern
c:\> dir
Directory of c:\
file1.txt
file2.txt
file3.txt
file4.txt
c:\>rename *.txt *.bak
c:\> dir
Directory of c:\
file1.bak
file2.bak
file3.bak
file4.bak
Ich weiß, dass ich hier verwenden könnte find -exec
, aber ist es möglich, eine kürzere Syntax zu verwenden - vielleicht mv
mit einigen speziellen Flags oder Syntax? Ich denke, der Schlüssel dazu ist der zweite *
Platzhalter, da Linux kein Problem mit dem ersten haben sollte (dh ich weiß, wie man die Dateien auswählt, die ich mit Platzhaltern umbenennen möchte).
Umbenennen einer einzelnen Datei - Verwenden eines Platzhalters
c:\> dir
Directory of c:\
file1.txt
c:\>rename file1.txt *.bak
c:\> dir
Directory of c:\
file1.bak
Dies ist besonders hilfreich, wenn Sie lange und unhandliche Dateinamen umbenennen. Ich dachte, ich könnte vielleicht mv file1.txt $1.bak
damit enden, file1.txt.bak
was auch akzeptabel wäre, aber ich bin nicht sicher, ob Sie den $1
Parameter inline mit einem Shell-Befehl referenzieren können . Auch in diesem speziellen Fall ist es nur praktisch, wie ms-dos den *
Platzhalter bastardisiert , um ihn als eine Art Erfassungs- / Ersetzungsübereinstimmung für einen Teil des Dateinamens zu verwenden.
Filtern von Verzeichnislisten mit einem Platzhalter
c:\> dir
Directory of c:\
file1.txt
file2.txt
file3.txt
file4.txt
text.txt
\temp (directory)
c:\> dir file*
Directory of c:\
file1.txt
file2.txt
file3.txt
file4.txt
c:\> t*
Directory of c:\
text.txt
\temp (directory)
Ich bin mir nicht sicher, mit welcher Syntax das richtig ls
ist oder ob es überhaupt möglich ist. Wenn ich so etwas getan habe ls t*
, wird es von Anfang an in Verzeichnisse zurückgeführt t
. Meine Problemumgehung wurde entweder verwendet find . --max-depth 1 -iname "t*"
oder so ähnlich ls -al | grep t
- keine davon ist so kurz und einfach wie sie dir t*
ist.
Schließlich weiß ich, dass ich Aliase einrichten kann, um diese langen Befehle zu verkürzen, aber ich würde gerne ein sofort einsatzbereites Linux-Fu lernen, um diese Dinge zu tun, da Sie manchmal mit einem Remote-System verbunden sind oder arbeiten auf einer neuen Maschine.
Wie kann ich mv
und ls
Dateien auf die gleiche Weise wie früher dir
und rename
Dateien?
quelle
somefunc *.Ext
wenn dieses Muster nicht mit einer Datei übereinstimmt, und spielen Sie mit Zitaten, um festzustellen, ob Sie es schaffen, ein Muster weiterzugeben ( ohne es erweitern zu lassen) zwischen Funktionen. Sicherheitstipp: Verwenden Sie nichts ,rm
während Sie mit Globbing / Shell-Expansion experimentieren :-)Eine Sache, die Sie bei Platzhaltern beachten sollten, ist, dass sie durch die Shell erweitert werden. Die Anwendung weiß nicht, ob Sie Platzhalter verwendet oder die Namen eingegeben haben. Wenn Sie beispielsweise eingeben
rename *.txt *.bak
,rename
sieht der Befehl so etwas wierename file1.txt file2.txt existingfile.bak
. Das sind nicht genug Informationen, um fortzufahren.Ich werde mich zuerst mit der Frage befassen
ls
, weil es einfacher ist. Wenn Sie nur die passenden Namen möchten, brauchen Sie diese nichtls
, da die Shell bereits die Erweiterung durchführt.Wenn Sie weitere Informationen zu den Dateien wünschen, übergeben Sie die
-d
Option anls
, um anzugeben, dass der Inhalt von Verzeichnissen nicht aufgelistet werden soll.Es gibt kein Standarddienstprogramm zum Umbenennen von Dateien, da die ersten Unix-Systeme keine hatten. Die portable Methode zum Umbenennen von Dateien verwendet eine Schleife und ist etwas ausführlich:
Es gibt mehrere gängige Dienstprogramme zum Umbenennen von Dateien, von denen keines garantiert auf einem bestimmten Unix-System installiert ist, die jedoch alle einfach zu installieren sind. Hier sind die wichtigsten:
rename
aus derutil-linux
Suite, verfügbar auf jedem nicht eingebetteten Linux-System (und nirgendwo anders). Unter Debian und Derivaten (einschließlich Ubuntu) wird dieser Befehl aufgerufenrename.ul
. Sofern nur.txt
die endgültige Erweiterung auftritt, können Sie schreibenrename
ist ein Perl-Skript, als das Debian und Derivate ausgeliefert werden/usr/bin/rename
. Sie können Dateien nach beliebigen Perl-Befehlen umbenennen.mmv
Dies kann Dateien nach verschiedenen namenbasierten Mustern umbenennen, kopieren und verknüpfen und bietet viele Optionen in Bezug darauf, was passiert, wenn bereits ein Zielname vorhanden ist. Beachten Sie, dass Sie Anführungszeichen verwenden müssen, um Platzhalter vor der Erweiterung durch die Shell zu schützen.zmv
ist eine zsh- Funktion, die genau dann verfügbar ist, wenn Ihre Shell zsh ist. Es kann mit beliebigen zsh-Mustern übereinstimmen (Sie können also Dateinamen nach beliebigen regulären Ausdrücken und nicht nur nach Platzhaltern abgleichen und Dateien nach anderen Kriterien wie Datum und Größe abgleichen).zmv
kann auch kopieren und verlinken.Wenn Sie die Kontrolle über die von Ihnen verwendeten Maschinen haben, empfehle ich, zsh als Shell zu verwenden (es hat andere Vorteile gegenüber bash) und diese Zeilen in Ihre
~/.zshrc
:noglob
ist eine zsh-Funktion, die die Shell anweist, im Argument des Befehls keine Platzhalter zu erweitern. Auf diese Weise können Sie schreibenzmv *.txt \$1.txt
(Sie müssen das immer$
in einem Ersatztext schützen ).quelle