Dateisystem durchsuchen und Dateien verschieben

Dateisystem durchsuchen und Dateien verschieben

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

verwandte Informationen