Flad et Nested Directory & File Hierarchy fra kommandolinjen i Mac OS X

Har du nogensinde brug for at flad en katalogstruktur, flytter alt filindhold fra en mapper til mapper i en mappe til en enkelt mappe? Mens du kan gøre det manuelt ved at flytte filer og mapper fra filsystemet Mac OS X eller Linux, er det hurtigere at vende sig til kommandolinjen. Måske på et tidspunkt skabte du et indlejret hierarki af mapper, som du nu skal fortryde ved at flytte alle filer ud af de indlejrede mapper og tilbage i en enkelt mappe, eller måske vil du forenkle en mappestruktur, uanset årsagen Trick virker ganske godt.


Brug af kommandolinjen til udførelse af fladning af filer og mappestrukturer er naturligvis bedst forbeholdt avancerede brugere, der er fortrolige med at bruge terminal generelt, hvis det ikke beskriver dig, overveje at gøre det manuelt via Finder eller bruge Mac Automator-appen til udføre lignende automatisering af filsystemaktiviteter. Vi fokuserer dog på mappefladning fra kommandolinjen her.

Eksempel på fladning af en nestet filmappe

For bedre at forstå, hvad vi forsøger at opnå, lad os tage et eksempel på en imaginær mappestruktur, der hedder TestDirectory, der er placeret i en brugers startmappe. I dette eksempel indeholder TestDirectory undermapper som SubDirectory1, SubDirectory2, SubDirectory3 osv., Hver med filer i de respektive mapper. Det vi søger at gøre her, er flad bibliotekstrukturen, flytter alle filer fra underkatalog (X) til overordnet mappe "TestDirectory". Den oprindelige mappe og indhold vist rekursivt med den kunne se noget sådan ud:

$ 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

Hvis du vil flette denne mappe og undermappe indhold ud igen i mappen TestDirectory, vil du bruge følgende kommandostreng:

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

Efter at katalogindholdet er blevet fladt, skal det se ud som dette, når det er angivet:

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

Bemærk, at underkatalogerne stadig eksisterer, de vil bare være tomme. Giver mening? Hvis ikke, eller hvis det ikke viser, hvad du vil udføre, vil du sandsynligvis ikke slette en mappe, måske vil du gerne slå sammen eller bruge dit til at lave en kompleks kopi til andre steder.

Udfladning af en katalogstruktur og nestet filhierarki med kommandolinjen

Klar til at fortsætte? Kommandostrengen, vi skal bruge til at flade en mappestruktur og flytte alle filer fra undermapper til bunden af ​​målmappen, er som følger:

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

Udskift [DIRECTORY] med den ønskede mappe til flad, som vist i eksemplet ovenfor.

Ja, mappen vises to gange i kommandostrengen. Første gang er den mappe, der søges for at flette underkataloger af, og anden gang som destination for de fundne genstande.

Vær præcis med den angivne destination, fordi dette ikke er reversibel (godt, i det mindste uden meget manuelt arbejde fra din side), så gør kun dette, hvis du er helt sikker på, at du vil flytte alle filerne i målkatalogbarnet mapper tilbage til målrotsmappen.

Som nævnt før kan du også gøre dette i Finder i OS X, eller i det mindste observere fil- og mappevariationerne i Finder. Alternativ + klikke på de små pile i listevisningen åbner alle underkataloger og viser mappehierarkiet som dette:

Efter fiddling med en række bash og zsh alternativer, blev dette handy trick efterladt af en kommenterer på StackExcange og det endte med at være den nemmeste og mest kompatible metode. Hvis du ved en bedre måde at flad en nestet bibliotek, så lad os vide i kommentarerne!