La procedura seguente richiede Bash e gli strumenti GNU di Linux. Lavora su una copia dei dati e crea prima una destinazione vuota, fuori dalla sorgente: mkdir -p /percorso/destinazione.
Appiattire più directory può produrre collisioni: due file diversi possono avere lo stesso nome. Prima di spostare, fai un backup e guarda quali file saranno selezionati:
find /percorso/sorgente -type f -printCon Bash e GNU mv, puoi spostare soltanto i file senza una destinazione omonima. La cartella di destinazione deve già esistere, essere fuori dalla sorgente e non essere modificata da altri processi durante il lavoro:
source_dir=/percorso/sorgente
dest_dir=/percorso/destinazione
while IFS= read -r -d '' file; do
target="$dest_dir/${file##*/}"
if [[ -e "$target" || -L "$target" ]]; then
printf 'Duplicato, lasciato nella sorgente: %s\n' "$file" >&2
continue
fi
mv -n -- "$file" "$target" || break
done < <(find "$source_dir" -type f -print0)I separatori NUL gestiscono spazi e ritorni a capo nei nomi. I file omonimi vengono lasciati nella sorgente, non rinominati o sovrascritti. Le directory e i link simbolici non vengono spostati. È una procedura locale, non transazionale: verifica alla fine i file rimasti e non usarla su directory scrivibili da soggetti non fidati.
Verifica con un esempio piccolo
Prova prima con due sottocartelle che contengono entrambe foto.jpg e una che contiene un file con spazi nel nome. Nella destinazione deve finire un solo foto.jpg; l’altro deve restare nella sorgente con una segnalazione di duplicato. Il file con spazi deve essere spostato correttamente. Controlla find /percorso/sorgente -type f alla fine: i file rimasti richiedono una decisione sul nome, non una seconda esecuzione che sovrascriva tutto.