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.png
eine Datei (alle Dateien, die mit 4_1 beginnen) greifen und in den 4_1_.jpg
Ordner legen. Ebenso möchte ich 4_2_0002.png
eine Datei (alle Dateien beginnend mit 4_2) greifen und in den 4_2_.jpg
Ordner 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" \;
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 echo
und führen Sie es erneut aus.
[[ -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 find
Befehl, gerne nachfolgenden Code mache, der auf die Ergebnisse einer Platzhalterbedingung reagiert find
."path/${line:2:3}.jpg/"
, "path/${line:2:3}.jpg
eine Datei umbenannt wurde, indem man sie ${line:2:3}.jpg
als Datei nicht in ein Verzeichnis verschoben hat, weil das Verzeichnis nicht existierte .
Benutzer3439894
sanjihan