spostare solo i file e non le cartelle

Certe volte può capitare, di ritrovarsi tante cartelle con al loro interno tanti file, e di voler spostare solo i file (escludendo quindi tutte le cartelle), in una nuova cartella così da averli tutti insieme e non separati in delle sottocartelle. Mi è capitato proprio qualche giorno fa che un utente in un gruppo telegram mi chiedesse aiuto per questo. Ad esempio può tornare utile dopo aver recuperato, tramite photorec, file cancellati da un HDD. Infatti photorec tutti i file recuperati li mette in diverse cartelle che crea al momento. Avere tante cartelle da controllare può essere scomodo. In questo caso farebbe comodo poter spostare tutti i file (senza cartelle) in una nuova cartella, così da averli tutti insieme e poterli controllare con più tranquillità.

Ovviamente questa operazione può essere fatta manualmente, spostando tutti i file in una nuova cartella, però è scomodo da fare se si hanno tante cartelle, perchè richiederebbe molto tempo.

Soluzione

Studiando il tool “mv” (che serve per spostare file), ci rendiamo conto che non ha opzioni per fare una cosa del genere. Però potremmo usare “mv” assieme al tool “find”. L’obbiettivo è quello di trovare tutti i file usando “find” e poi spostarli tramite “mv”. Questa operazione è molto semplice e richiede un solo comando. Guardando il manuale di find, scopriamo che ci sono alcune opzioni che fanno al caso nostro.

find . -type f -print0 | xargs -0 mv -t ~/prova/dest/

Questo comando cerca nella cartella corrente, tutti i file. (-print0, fa si che tutti i file trovati siano separati da uno spazio invece che metterli “a capo”).

 

Vediamo un esempio per capire meglio

find . -type f

Dando il comando senza “-print0” avremo questo output

spostare solo file

Questo è un problema per poi passare i file al tool “mv”

 

Se invece usiamo il comando

find . -type f -print0

avremo questo output

spostare solo file

come vedete ora i file sono messi tutti nella stessa riga.

A questo punto abbiamo la lista di file da spostare, utilizziamo il comando xargs -0 per passare tutti questi file ad mv (l’opzione -t di mv, specifica proprio che deve leggere gli argomenti passati). In questo modo tutto ciò che “xargs -0” passa ad “mv”, “mv” lo sposterà nella cartella destinataria.

 

Esempio pratico

Ecco l’esempio completo. Questa è la situazione iniziale.

spostare solo file

come vedete all’interno della cartella abbiamo 3 sottocartelle “dir1”, “dir2” e “solofile”. La prima contiene 5 file, la seconda altri 5 file, e la terza (che sarà la nostra cartella destinataria) è vuota.

Eseguiamo il seguente comando.

find . -type f -print0 | xargs -0 mv -t solofile/

In questo modo diciamo che tutti i file trovati, devono essere spostati nella cartella “solofile”.

Ed ecco la situazione al termine del comando

spostare solo file

Come vedete, ora le cartelle “dir1” e “dir2” sono vuote, e tutti i 10 file, sono stati spostati dentro la cartella “solofile”.