Ich habe ein altes ReadyNAS Duo v1 (Sparc), auf dem eine unbekannte Linux-Variante ausgeführt wird.
Ich habe eine Ordnerstruktur mit mehr als 1.000 Dateien, die ich in eine Ordnerstruktur verschieben möchte, die auf dem Anfangsbuchstaben des Dateinamens basiert (Groß-/Kleinschreibung wird nicht beachtet).
Idealerweise möchte ich, dass die Dateistruktur so aussieht:
myfiles-+
+-A
+ Apple.txt
+ avocado.txt
+-B
+ Banana.txt
+ broccoli.txt
etc. etc.
Ich hatte Google, habe aber nur GUI-Tools gefunden.
Kann dies über die Befehlszeile oder ein Skript erfolgen?
Akzeptierte Antwort:
Hier ist ein kleiner Einzeiler, der tut, was Sie wollen:
$ mkdir -p output/{A..Z}; for i in tstdir/*; do export FILE=$(basename "$i"); LTR=$(echo" ${FILE:0:1}" | tr [a-z] [A-Z]); mv "$i" "output/$LTR/$FILE" ; done
Hier ist derselbe Befehl in erweiterter Form, damit Sie sehen können, was los ist:
$ mkdir -p output/{A..Z}
$ for i in tstdir/*; do
FILE=$(basename "$i")
LTR=$(echo "${FILE:0:1}" | tr [a-z] [A-Z])
mv "$i" "output/$LTR/$FILE"
done
Einzelheiten
Das Obige geht zunächst davon aus, dass das Ausgabeverzeichnis nur der Buchstaben nicht existiert, und erstellt es daher,
$ mkdir -p output/{A..Z}
Der for
loop funktioniert wie folgt und durchläuft alle Dateien in tstdir/*
. Es bestimmt dann den basename
dieses Pfads und speichert sie in der Variablen $FILE
. Jede Iteration durch die Schleife wird in der Variablen $i
gespeichert .
FILE=$(basename "$i")
Wir verwenden dann die Bashes-Fähigkeit, um das erste Zeichen der benannten Variablen, $FILE
, zurückzugeben , und verwenden Sie dann tr
um alle Kleinbuchstaben in Großbuchstaben umzuwandeln.
LTR=$(echo "${FILE:0:1}" | tr [a-z] [A-Z])
Brechen Sie dies ein bisschen mehr auf:
$ echo "${FILE:0:1}"
s
$ echo "${FILE:0:1}"
T
Mit dem tr
Code können Sie jetzt sehen, was los ist:
$ echo "${FILE:0:1}" | tr [a-z] [A-Z]
S
$ echo "${FILE:0:1}" | tr [a-z] [A-Z]
T
Der Rest des Befehls verschiebt die Dateien einfach in ihr entsprechendes Anfangsbuchstabenverzeichnis.
Beispiel
Angenommen, wir haben dieses Dateiverzeichnis:
$ touch {a-z}file {A-Z}file
$ tree tstdir/ | head -10
tstdir/
|-- afile
|-- Afile
|-- bfile
|-- Bfile
|-- cfile
|-- Cfile
|-- dfile
|-- Dfile
|-- efile
...
Nach dem Ausführen des Einzeilers:
$ tree output/ | head -10
output/
|-- A
| |-- afile
| `-- Afile
|-- B
| |-- bfile
| `-- Bfile
|-- C
| |-- cfile
| `-- Cfile
...