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

Har du noen gang trengte å flate en katalogstruktur, flytter alt filinnhold fra en mappe til mapper i en mappe til en enkelt mappe? Mens du kan gjøre dette manuelt ved å flytte filer og mapper fra filsystemet Mac OS X eller Linux, er det raskere å vende seg til kommandolinjen. Kanskje på et tidspunkt skapte du et nestet hierarki av kataloger som du nå må angre ved å flytte alle filer ut av de nestede mappene og tilbake til en enkelt katalog, eller kanskje du ønsker å forenkle en katalogstruktur, uansett årsak triks fungerer ganske bra.


Å bruke kommandolinjen for å utføre flattning av filer og katalogstrukturer er åpenbart best reservert for avanserte brukere som er komfortable med å bruke terminal generelt, hvis det ikke beskriver deg, vurdere å gjøre det manuelt via Finder, eller bruk Mac Automator-appen til oppnå lignende automatisering av filsystemaktiviteter. Vi fokuserer imidlertid på katalogflagging fra kommandolinjen her, men.

Eksempel på flattning av en nestet filkatalog

For å bedre forstå hva vi prøver å oppnå, la oss ta et eksempel på imaginær katalogstruktur, kalt TestDirectory, som er plassert i en brukerens Hjem-mappe. I dette eksemplet inneholder TestDirectory undermapper som SubDirectory1, SubDirectory2, SubDirectory3, etc, hver med filer i de respektive mappene. Det vi ønsker å gjøre her, er flatt katalogstrukturen, flytter alle filer fra underkatalog (X) til overordnet katalog "TestDirectory". Den første katalogen og innholdet som vises rekursivt med, kan se slik ut:

$ 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 katalogen og underkataloginnholdet ut igjen i mappen TestDirectory, vil du bruke følgende kommandostreng:

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

Etter at kataloginnholdet har blitt flatt, bør det se slik ut når det er listet ut:

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

Vær oppmerksom på at underkatalogene fortsatt eksisterer, de vil bare være tomme. Gir mening? Hvis ikke, eller hvis det ikke viser hva du vil oppnå, vil du sannsynligvis ikke flette en katalog i det hele tatt, kanskje du ønsker å slå sammen eller bruke ditto til å gjøre en komplisert kopi til andre steder.

Flatere en katalogstruktur og nestet filhierarki med kommandolinjen

Klar til å fortsette? Kommandostrengen vi skal bruke til å flette en katalogstruktur og flytte alle filer fra underkataloger til bunnen av målkatalogen, er som følger:

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

Erstatt [DIRECTORY] med katalogen du ønsker å flate, som vist i eksemplet ovenfor.

Ja, katalogen vises to ganger i kommandostrengen, den første gangen er katalogen som søktes å flate underkataloger av, og den andre gangen som mål for de funnet elementene.

Vær presis med den angitte destinasjonen, fordi dette ikke er reversibel (vel, i det minste uten mye manuelt arbeid fra din side), så gjør bare dette hvis du er helt sikker på at du vil flytte alle filene i målkatalogbarnet kataloger tilbake til målrotsmappen.

Som nevnt tidligere, kan du også gjøre dette i Finder of OS X, eller i det minste observere fil- og mappendringer i Finder. Alternativ + klikke på de små pilene i listevisningen åpner alle underkataloger, og viser mappehierarkiet slik:

Etter fiddling med en rekke bash og zsh alternativer, ble dette praktiske triksen igjen av en kommenterer på StackExcange, og det endte med å være den enkleste og mest kompatible metoden. Hvis du vet om en bedre måte å flate en nestet katalog, så gi oss beskjed i kommentarene!