holen Sie sich die ersten Zeichen des Erweiterungsparameters des Find-Befehls

Ich habe eine riesige Sammlung von Bildern und möchte sie in Ordnern ablegen, die ihren ersten 3 Zeichen + .jpg-Erweiterung entsprechen.

Ich möchte also 4_1_0002.pngeine Datei (alle Dateien, die mit 4_1 beginnen) greifen und in den 4_1_.jpgOrdner legen. Ebenso möchte ich 4_2_0002.pngeine Datei (alle Dateien beginnend mit 4_2) greifen und in den 4_2_.jpgOrdner legen.

Alle Dateien, die ich sortieren möchte, befinden sich jetzt in einem riesigen Ordner. Ich habe erwartet, einen find-Befehl zu verwenden, aber ich weiß nicht, wie ich die ersten drei Zeichen aus dem Erweiterungsparameter {} extrahieren soll.

find . -type f -ok echo mv {} "path/first3char.jpg" \;

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Nur neugierig, warum möchten Sie .png-Dateien in einem Ordner mit einer .jpg-Erweiterung ablegen, warum nicht in einem Ordner mit einer .png-Erweiterung?
Zuerst habe ich mit JPGs gearbeitet, bin dann aber auf PNGs umgestiegen. Hab mich nicht getraut den Namen zu ändern

Antworten (1)

Angenommen, alle Ihre Dateien befinden sich im selben Verzeichnis und die Dateinamen sind vernünftig, so etwas wie

 find . -maxdepth 1 -type f -name '*png' |
     while read line; do
         echo mv "$line" "path/${line:2:3}.jpg/"
     done

Führen Sie den Befehl zuerst wie beschrieben aus (einschließlich des echo), um zu prüfen, ob das Ergebnis sinnvoll ist. Entfernen Sie dann das echound führen Sie es erneut aus.

Obwohl ich die Antwort positiv bewertet habe, würde ich dennoch eine Bedingung in Form von Tests hinzufügen, dass das Verzeichnis vorhanden ist, z. B. , [[ -d path/${line:2:3}.jpg ]]und es wie z. B. verwenden find . -maxdepth 1 -type f -name '*png' | while read line; do [[ -d path/${line:2:3}.jpg ]] && echo mv "$line" "path/${line:2:3}.jpg/"; done. Das heißt, wenn das Verzeichnis nicht existiert, wird die Datei natürlich nicht verschoben. Der Grund für den Vorschlag ist, dass ich jedes Mal, wenn ich einen Platzhalter verwende, wie z. B. '*png'im findBefehl, gerne nachfolgenden Code mache, der auf die Ergebnisse einer Platzhalterbedingung reagiert find.
Ich erwähne dies, weil als Beispiel, wenn man versehentlich (oder absichtlich) den nachgestellten Schrägstrich von " weggelassen hat "path/${line:2:3}.jpg/", "path/${line:2:3}.jpgeine Datei umbenannt wurde, indem man sie ${line:2:3}.jpgals Datei nicht in ein Verzeichnis verschoben hat, weil das Verzeichnis nicht existierte .