Aplatir un répertoire imbriqué et une hiérarchie de fichiers à partir de la ligne de commande de Mac OS X

Avez-vous déjà eu besoin d'aplatir une structure de répertoire, en déplaçant tous les contenus de fichiers d'un répertoire enfant de répertoires dans un seul dossier? Bien que vous puissiez le faire manuellement en déplaçant les fichiers et les dossiers du système de fichiers de Mac OS X ou de Linux, une option plus rapide consiste à utiliser la ligne de commande. Peut-être avez-vous créé une hiérarchie imbriquée de répertoires que vous devez maintenant annuler en déplaçant tous les fichiers de ces dossiers imbriqués dans un seul répertoire, ou peut-être cherchez-vous à simplifier une structure de répertoire, quelle qu'en soit la raison. trick fonctionne assez bien.


L'utilisation de la ligne de commande pour accomplir l'aplatissement des fichiers et des structures de répertoires est évidemment mieux réservée aux utilisateurs avancés qui sont à l'aise avec l'utilisation du terminal, si cela ne vous décrit pas, envisagez de le faire manuellement via Finder ou l'application Mac Automator. accomplir une automatisation similaire des activités du système de fichiers. Cependant, nous nous concentrons sur l'aplatissement des répertoires à partir de la ligne de commande.

Exemple d'aplatissement d'un répertoire de fichiers imbriqué

Pour mieux comprendre ce que nous essayons d'accomplir, prenons un exemple de structure de répertoire imaginaire appelée TestDirectory située dans un dossier d'accueil de l'utilisateur. Dans cet exemple, TestDirectory contient des sous-dossiers tels que SubDirectory1, SubDirectory2, SubDirectory3, etc., chacun avec des fichiers dans ces dossiers respectifs. Ce que nous cherchons à faire ici est d'aplatir la structure du répertoire, en déplaçant tous les fichiers de SubDirectory (X) vers le répertoire parent "TestDirectory". Le répertoire initial et le contenu affiché récursivement avec le peuvent ressembler à ceci:

$ 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

Pour aplatir ce répertoire et ses sous-répertoires dans le dossier TestDirectory, vous devez utiliser la chaîne de commande suivante:

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

Une fois le contenu du répertoire aplati, il devrait ressembler à ceci:

~/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

Notez que les sous-répertoires existeront toujours, ils seront juste vides. Avoir du sens? Si ce n'est pas le cas, ou si cela ne montre pas ce que vous voulez accomplir, vous ne voulez probablement pas du tout aplatir un répertoire, peut-être que vous cherchez à fusionner ou utiliser ditto pour faire une copie complexe ailleurs.

Aplatissement d'une structure de répertoire et d'une hiérarchie de fichiers imbriqués avec la ligne de commande

Prêt à continuer? La chaîne de commande que nous allons utiliser pour aplatir une structure de répertoire et déplacer tous les fichiers des sous-répertoires vers la base du répertoire cible est la suivante:

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

Remplacez [RÉPERTOIRE] par le répertoire de votre choix pour l'aplatir, comme illustré dans l'exemple ci-dessus.

Oui, le répertoire apparaît deux fois dans la chaîne de commande, la première fois est le répertoire recherché pour aplatir les sous-répertoires de, et la deuxième fois comme destination pour les éléments trouvés.

Soyez précis avec la destination spécifiée, parce que ce n'est pas réversible (enfin, au moins sans beaucoup de travail manuel de votre part), ne le faites que si vous êtes absolument sûr de vouloir déplacer tous les fichiers dans les répertoires cibles enfant répertoires vers le dossier racine cible.

Comme mentionné précédemment, vous pouvez également le faire dans le Finder d'OS X, ou au moins observer les changements de fichiers et de dossiers dans le Finder. Option + cliquer sur les petites flèches dans la vue Liste ouvre tous les sous-répertoires, en affichant la hiérarchie des dossiers comme ceci:

Après avoir joué avec une variété d'alternatives bash et zsh, ce truc pratique a été laissé par un commentateur sur StackExcange et il a fini par être la méthode la plus facile et la plus compatible. Si vous connaissez un meilleur moyen d'aplatir un répertoire imbriqué, faites le nous savoir dans les commentaires!