Appiattisci una directory nidificata e una gerarchia di file dalla riga di comando di Mac OS X.

Avete mai avuto bisogno di appiattire una struttura di directory, spostando tutto il contenuto del file da una cartella figlio di una directory in una singola cartella? Mentre puoi farlo manualmente spostando file e cartelle dal file system di Mac OS X o Linux, un'opzione più veloce è quella di passare alla riga di comando. Forse a un certo punto hai creato una gerarchia nidificata di directory che ora devi annullare spostando tutti i file fuori da quelle cartelle nidificate e tornando in un'unica directory, o forse stai cercando di semplificare una struttura di directory, qualunque sia il motivo, questo il trucco funziona abbastanza bene.


Usare la riga di comando per realizzare l'appiattimento di file e strutture di directory è ovviamente meglio riservato agli utenti avanzati che si sentono a proprio agio con l'uso del terminale in generale, se ciò non ti descrive, considera di farlo manualmente tramite Finder o utilizzando l'app Mac Automator per realizzare un'automazione simile delle attività del file system. Tuttavia, ci stiamo concentrando sull'appiattimento delle directory dalla riga di comando.

Esempio di conversione di una directory di file nidificata

Per capire meglio cosa stiamo cercando di realizzare, prendiamo un esempio di struttura di directory immaginaria chiamata TestDirectory che si trova in una cartella Home dell'utente. In questo esempio, TestDirectory contiene sottocartelle come Sottodirectory1, Sottodirectory2, Sottodirectory3 e così via, ognuna con file nelle rispettive cartelle. Quello che stiamo cercando di fare qui è appiattire la struttura delle directory, spostando tutti i file da SubDirectory (X) alla directory principale "TestDirectory". La directory iniziale e i contenuti mostrati in modo ricorsivo potrebbero apparire in questo modo:

$ find ~/TestDirectory/ -type f
~/TestDirectory/rooty.jpg
~/TestDirectory/SampleDirectory1/beta-tool-preview.jpg
~/TestDirectory/SampleDirectory1/alphabeta-tool.jpg
~/TestDirectory/SampleDirectory2/test-tools.jpg
~/TestDirectory/SampleDirectory3/test-png.jpg
~/TestDirectory/SampleDirectory3/test1.jpg
~/TestDirectory/SampleDirectory3/test2.jpg

Per appiattire nuovamente la directory e il contenuto della sottodirectory nella cartella TestDirectory, si utilizzerà la seguente stringa di comando:

find TargetDirectory/ -mindepth 2 -type f -exec mv -i '{}' TargetDirectory/ ';'

Dopo che il contenuto della directory è stato appiattito, dovrebbe apparire come questo quando elencato:

~/TestDirectory/rooty.jpg
~/TestDirectory/beta-tool-preview.jpg
~/TestDirectory/alphabeta-tool.jpg
~/TestDirectory/test-tools.jpg
~/TestDirectory/test-png.jpg
~/TestDirectory/test1.jpg
~/TestDirectory/test2.jpg

Nota che le sottodirectory continueranno a esistere, saranno semplicemente vuote. Ha senso? In caso contrario, o se ciò non dimostra ciò che si vuole realizzare, probabilmente non si vuole appiattire una directory, forse si sta cercando di unire o usare idem per fare una copia complessa altrove.

Appiattimento di una struttura di directory e gerarchia di file nidificati con la riga di comando

Pronto a procedere? La stringa di comando che useremo per appiattire una struttura di directory e spostare tutti i file dalle sottodirectory alla base della directory di destinazione è la seguente:

find [DIRECTORY] -mindepth 2 -type f -exec mv -i '{}' [DIRECTORY] ';'

Sostituisci [DIRECTORY] con la directory di tua scelta da appiattire, come dimostrato nell'esempio sopra.

Sì, la directory viene visualizzata due volte nella stringa di comando, la prima volta la directory viene cercata per appiattire le sottodirectory e la seconda volta come destinazione per gli elementi trovati.

Sii preciso con la destinazione specificata, perché questo non è reversibile (beh, almeno senza un sacco di lavoro manuale da parte tua), quindi fallo solo se sei assolutamente sicuro di voler riposizionare tutti i file nel bambino delle directory di destinazione le directory tornano alla cartella radice di destinazione.

Come accennato in precedenza, è possibile farlo anche nel Finder di OS X, o almeno osservare le modifiche al file e alla cartella nel Finder. L'opzione + facendo clic sulle piccole frecce nella vista Elenco apre tutte le sottodirectory, mostrando la gerarchia delle cartelle in questo modo:

Dopo aver giocato con una varietà di alternative bash e zsh, questo pratico trucco è stato lasciato da un commentatore su StackExcange e ha finito per essere il metodo più semplice e più compatibile. Se sei a conoscenza di un modo migliore per appiattire una directory annidata, faccelo sapere nei commenti!