
Ich muss ein Skript schreiben, das in eine Liste von Verzeichnissen geht und dann Dateien mit bestimmten Dateitypen in ein anderes Verzeichnis verschiebt.
Mit dem unten stehenden Code kann ich alle Ordner in einem Verzeichnis durchlaufen und ihre Namen ausdrucken. Ich gehe davon aus, dass ich zwischen diesen Ordnern wechseln muss.
for d in */
do
echo "$d"
done
Der folgende Code durchläuft jede PNG-Datei und verschiebt sie in das gewünschte Verzeichnis.
for file in *.png
do
mv "$file" /desired/directory
done
Wenn ich jetzt aus irgendeinem Grund den zweiten Codeblock in den ersten einfüge, erhalte ich diese Ausgabe:
mv: cannot stat ‘*.png’: No such file or directory
Wie kann ich es dazu bringen, jede Datei zu durchsuchen und zu verschieben? Ich möchte dieses Skript im Stammverzeichnis des Verzeichnisses /search/ platzieren.
Antwort1
for d in */
do
mv - n *.png /desired/directory/
done
Es wird ein Problem mit Dateien mit demselben Namen geben, da die erste geschrieben wird und die folgenden nicht, da das Tag -n gesetzt ist, da sonst die zweite die erste überschreiben würde und die erste Datei verloren ginge. Dadurch werden keine Dateien im Unterverzeichnis kopiert.
Streichen Sie diese Verwendung
find /search/directory/ -inane "*.png" -exce mv -n {} /desired/directory/ \;
Bei Dateien mit gleichem Namen tritt jedoch das gleiche Problem auf.
Wenn Sie Duplikate benannter Dateien möchten, z. B. Pic.png 1Pic.png 2Pic.png usw.
dup=1
find /search/directory/ -inane "*.png" -exce mv -n {} /desired/directory/ \;
while(find /search/directory/ -inane "*.png" | wc -l !=0)
find /search/directory/ -inane "*.png" -exce mv -n {} /desired/directory/$dup$(basename {}) \;
dup++
done
Diese Schleife wird nicht unterbrochen, wenn /desired/directory im /search/directory liegt. Ich habe das aus dem Stegreif gemacht, der einzige Teil, der mir Sorgen macht, ist die while-Bedingung, die möglicherweise das find | wc in Klammern erfordert, vielleicht mit $ davor. Dies könnte durch eine Fehlerprüfung weiter verbessert werden und .png /search/directory /desired/directory als Argumente haben
Antwort2
Dies sollte Folgendes bewirken:
#!/bin/bash
for dir in /full/path/to/recup_Dir.{1..976}; do
mv "$dir"/*.png /full/path/to/desired/directory/
done
Hier durchlaufen wir die Quellverzeichnisse und kopieren dann alle .png
Dateien aus diesen Verzeichnissen in das gewünschte Verzeichnis. Da wir hier die absoluten Pfade verwenden, können Sie dieses Skript von jedem beliebigen Ort aus ausführen.