Ich suche nach einer Möglichkeit (vorzugsweise Terminal), über 1000 Schriften nach ihrem Anfangsbuchstaben zu sortieren.
Erstellen Sie im Allgemeinen Verzeichnisse A-Z, #
und verschieben Sie die Schriftdateien dann in diese Verzeichnisse, basierend auf dem Dateinamen des ersten Zeichens. Schriftarten, die mit Zahlen [0-9] oder anderen Sonderzeichen beginnen, werden in das #
Verzeichnis verschoben .
command-line
files
Parto
quelle
quelle
Antworten:
Eine späte Python-Option:
Wie benutzt man
move_files.py
Führen Sie es mit dem Verzeichnis als Argument aus:
Das Skript erstellt nur dann das (Unter-) Verzeichnis (-ies) (in Großbuchstaben), wenn es tatsächlich benötigt wird
Erläuterung
Das Drehbuch:
listet die Dateien auf, erhält das erste Zeichen (definiert den Quellpfad):
prüft, ob der Gegenstand eine Datei ist:
Definiert den Zielordner, ob das erste Zeichen Alpha ist oder nicht:
prüft, ob der Ordner bereits existiert oder nicht, erstellt ihn, wenn nicht:
verschiebt das Objekt in den entsprechenden Ordner:
quelle
Code-golfed und doch lesbar mit nur zwei Befehlen und zwei regulären Ausdrücken:
Wenn Sie eine große Anzahl von Dateien verschieben müssen, zu viele, um in die Prozessargumentliste zu passen (ja, es gibt ein Limit und es können nur einige Kilobyte sein), können Sie die Dateiliste mit einem anderen Befehl generieren und diese an weiterleiten
prename
, z.B:Dies hat den zusätzlichen Vorteil, dass der Literaldateiname nicht verschoben wird,
[[:alnum:]]?*
wenn keine Dateien mit dem Glob-Muster übereinstimmen.find
erlaubt auch viel mehr Übereinstimmungskriterien als Shell-Globbing. Eine Alternative besteht darin, dienullglob
Shell-Option festzulegen und den Standardeingabestream von zu schließenprename
. 1Entfernen Sie in beiden Fällen den
-n
Schalter, um die Dateien tatsächlich zu verschieben, und zeigen Sie nicht nur, wie sie verschoben würden.Nachtrag: Sie können die leeren Verzeichnisse wieder entfernen mit:
1
shopt -s nullglob; prename ... <&-
quelle
Wenn Sie nichts dagegen haben, zsh, eine Funktion und ein paar
zmv
Befehle:Die
mmv
Funktion erstellt das Verzeichnis und verschiebt die Datei.zmv
bietet dann Mustererkennung und -ersetzung. Verschieben Sie zuerst Dateinamen, die mit einem Alphabet beginnen, und dann alles andere:Führen Sie erneut ohne die
echo
inmmv
‚s - Definition , um tatsächlich die Bewegung auszuführen.quelle
Ich habe keine gute Möglichkeit gefunden, die Verzeichnisnamen in Großbuchstaben zu schreiben (oder die Dateien in Großbuchstaben zu verschieben), obwohl Sie dies später mit
rename
...oder besser lesbar:
Entfernen Sie
echo
nach dem Testen, um die Dateien tatsächlich zu verschiebenUnd dann
entfernen,
-n
wenn es nach dem Testen gut aussieht, und erneut ausführen.quelle
if [[ -d "${i^}" ]]
, um das variablei
Kapital undmkdir {A..Z}
am Anfang zu machen.Die folgenden Befehle in dem Verzeichnis, das die Schriftarten enthält, sollten funktionieren. Wenn Sie sie von außerhalb des Schriftarten-Speicherverzeichnisses verwenden möchten, ändern Sie sie
for f in ./*
infor f in /directory/containing/fonts/*
. Dies ist eine sehr Shell-basierte Methode, also ziemlich langsam und auch nicht-rekursiv. Dadurch werden nur Verzeichnisse erstellt, wenn Dateien vorhanden sind, die mit dem entsprechenden Zeichen beginnen.Als Einzeiler wieder aus dem Font-Speicher-Verzeichnis heraus:
Eine Methode, die find mit einer ähnlichen Zeichenfolgenmanipulation verwendet und eine Bash-Parameter-Erweiterung verwendet, die rekursiv ist und etwas schneller als die reine Shell-Version sein sollte:
Oder besser lesbar:
quelle
Ordnen Sie jeden Dateinamen einem Verzeichnisnamen zu, indem Sie
tr
dannmkdir
und verwendenmv
:quelle
tr
, um es in Großbuchstaben umzuwandeln.xargs
einfachbash
nochmal durch telefonieren ? Wäre es nicht einfacher und viel lesbarer, die Ausgabe vonfind
in eine while-Schleife zu leiten undread
dort Datensatz für Datensatz abzuspielen?while
Loop-Version ( bit.ly/2j2mhyb ) vielleicht besser ist.{}
Ersetzung vermeiden, indem Siexargs
das Argument anhängen lassen und dann$1
im Shell-Skript nachschlagen, zxargs -0 -n1 -- bash -c 'dir=/dest/$(basename "$1" | ...); ...; mv "$1" "$dir"' _
. (Beachten Sie das Finale_
!)