Spostare tutti i file dalle sottodirectory nella directory corrente?


13

Come posso spostare i file contenuti in tutte le sottodirectory nella directory corrente e quindi rimuovere le sottodirectory vuote?

Ho trovato questa domanda , ma adattando la risposta a:

mv * .

non ha funzionato; Ho ricevuto molti avvisi simili a:

mv: wil and ./wil are identical

I file contenuti nelle sottodirectory hanno nomi univoci.

Risposte:


22

Puoi anche usare l' -mindepthopzione:

find . -type f -mindepth 2 -exec mv -i -- {} . \;

(Insieme a -maxdepthte potresti anche limitare i livelli di gerarchia da cui raccogliere i file.)

Ho usato mv -i("interattivo") per mvchiedere prima di sovrascrivere i file. Con molte sottodirectory, potrebbero esserci degli scontri di nomi di cui ti piacerebbe essere avvisato.

L' --opzione interrompe l'elaborazione delle opzioni, quindi mvnon viene confusa dai nomi dei file che iniziano con un trattino.

Ripulisci l'intero gruppo di sottodirectory vuote con

find . -depth -mindepth 1 -type d -empty -exec rmdir {} \;

C'è anche un modo per saltare la domanda per sovrascrivere i file senza sovrascriverli?
Filnor,

2
Opzioni per mv:: -n, --no-clobbernon sovrascrivere un file esistente. Potresti essere interessato -b, --backupanche a.
Florian Jenn,

5

Prova questo:

find ./*/* -type f -print0 | xargs -0 -J % mv % .

Ulteriori informazioni: prova da solo lo stamement, dovrebbe darti un elenco con tutti i file che vuoi spostare (tralascia -print0). Esempio:

probe:test trurl$ find ./*/* -type f
./test_s/test_s_s/testf4
./test_s/test_s_s/testf5
./test_s/testf1
./test_s/testf2
./test_s/testf3
./test_s2/testf6
./test_s2/testf7

con -print0e xargsstai creando un elenco di istruzioni da eseguire. Il -J %flag significa, inserire qui l'elemento list, quindi mv $FILE .viene eseguito per ogni file trovato.

Quanto sopra funziona per gli xargs BSD. Se stai usando la versione GNU (Linux) prendi -I %invece di-J %


0

Bash 4:

shopt -s globstar
for file in **; do [[ -f "$file" ]] && mv "$file" .; done

-2

1 trucco rapido, funziona solo se i tuoi file hanno estensioni (con un punto):

mv *.* subdir/
mv .* subdir/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.