Plattar en nestad katalog och filhierarki från kommandoraden i Mac OS X

Har du någonsin behövt att platta en katalogstruktur, flyttar allt filinnehåll från en katalogbarns mappar till en enda mapp? Medan du kan göra det manuellt genom att flytta runt filer och mappar från filsystemet Mac OS X eller Linux, är det snabbare att vända sig till kommandoraden. Kanske vid en tidpunkt skapade du en kapslad hierarki av kataloger som du nu behöver ångra genom att flytta alla filer ur de kapslade mapparna och tillbaka till en enda katalog, eller kanske du vill förenkla en katalogstruktur, oavsett orsaken trick fungerar ganska bra.


Att använda kommandoraden för att utföra flattning av filer och katalogstrukturer är uppenbarligen bäst för avancerade användare som är bekanta med att använda terminal i allmänhet, om det inte beskriver dig, överväga att göra det manuellt via Finder eller använda Mac Automator-appen till uppnå liknande automatisering av filsystemaktiviteter. Vi fokuserar dock på katalogplattring från kommandoraden här.

Exempel på att fläta en nestad filkatalog

För att bättre förstå vad vi försöker åstadkomma, låt oss ta ett exempel på en imaginär katalogstruktur som heter TestDirectory i en hemmapp för användaren. I det här exemplet innehåller TestDirectory undermappar som SubDirectory1, SubDirectory2, SubDirectory3, etc, var och en med filer i respektive mappar. Vad vi vill göra här är att plana katalogstrukturen, flytta alla filer från underkatalog (X) till moderkatalogen "TestDirectory". Den ursprungliga katalogen och innehållet som visas rekursivt med kan se ut så här:

$ 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

För att plana denna katalog och underkatalog innehåll tillbaka i mappen TestDirectory, skulle du använda följande kommandosträng:

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

När kataloginnehållet har blivit plattat ska det se ut så här när det listas 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

Observera att underkatalogerna fortfarande finns, de kommer bara vara tomma. Vettigt? Om inte, eller om det inte visar vad du vill uppnå, vill du förmodligen inte platta en katalog alls, kanske du vill slå samman eller använda ditto för att göra en komplex kopia till någon annanstans.

Utplåning av en katalogstruktur och nestad filhierarki med kommandoraden

Klar att fortsätta? Kommandosträngen som vi ska använda för att plana en katalogstruktur och flytta alla filer från underkataloger till basen av målkatalogen är följande:

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

Byt ut [DIRECTORY] med den katalog du vill välja för att platta, vilket visas i exemplet ovan.

Ja, katalogen visas två gånger i kommandoraden. Första gången är katalogen som söks för att plana underkataloger om, och andra gången som destination för de hittade objekten.

Var exakt med den angivna destinationen, för det här är inte reversibel (bra, åtminstone utan mycket manuellt arbete från din sida), så gör bara det här om du är helt säker på att du vill flytta alla filer i målkatalogbarnet kataloger tillbaka till målrotsmappen.

Som tidigare nämnts kan du också göra detta i Finder i OS X, eller åtminstone observera fil- och mappbyten i Finder. Alternativ + klicka på de små pilarna i listvyn öppnar alla underkataloger och visar mapphierarkin så här:

Efter att ha frikopplat med en mängd bash och zsh-alternativ var detta praktiska trick kvar av en commenter på StackExcange och det slutade vara den enklaste och mest kompatibla metoden. Om du vet om ett bättre sätt att platta en kapslade katalog, låt oss veta i kommentarerna!