GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Bash-Skript zum Sortieren von Dateien in alphabetische Ordner auf Readynas Duo V1?

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
...

Linux
  1. Bash sortieren

  2. Wie sortiere ich Dateien in Ordnern nach Dateityp auf Bash (mit dem Befehl ‚file‘)?

  3. Bash-Skript zum Löschen aller bis auf N Dateien bei alphabetischer Sortierung

  4. bash:Listendateien in eine Variable einfügen, aber die Größe des Arrays ist 1

  5. Löschen Sie alle Dateien außer den neuesten 3 im Bash-Skript

35 Bash-Skriptbeispiele

So führen Sie ein Bash-Skript aus

Shell-Skript:Dateien in Verzeichnisse und Unterverzeichnisse sortieren?

Welcher Befehl wird verwendet, um die Liste der Dateien/Ordner nach Zeit zu sortieren?

Verwenden von Bash Sort zum Sortieren von Dateien wie ein Boss

Bash-Skript zum Löschen von Dateien, die älter als x Tage sind, mit Unterverzeichnissen