Directory
如何從遞歸目錄中提取特定命名的文件夾,刪除其他文件夾?
我有這種通過解壓縮 zip 文件獲得的目錄樹:
x -> y -> z ->執行-> 文件和目錄
所以有4個目錄,其中3個是空文件(x,y,z),只包含1個子目錄,還有我感興趣的目錄,命名為“ run ”。
我想將“執行”目錄本身(包括其中的所有內容)移動到我解壓縮的“根”位置(即“x”所在的位置,但不在“x”內部)。
假設:存在一個名為“run”的文件夾,但我不知道我必須“cd”多少個目錄才能訪問它(可能是 3 (x,y,z),可能是 10 或更多。名稱也是未知的,不必是 x、y、z 等)。
我怎樣才能做到這一點?我嘗試了這個問題的許多變體,但都失敗了。
關於什麼
find . -type d -name run -exec mv {} /path/to/X \;
在哪裡
- /path/to/X 是您的目標目錄
- 你從同一個地方開始。
- 然後使用其他答案刪除空目錄。
(在旁注中,有一個
--junk-paths
zip 選項,無論是在壓縮還是解壓縮時)
我會這樣做
bash
,使用globstar
. 如中所述man bash
:globstar If set, the pattern ** used in a pathname expansion con‐ text will match all files and zero or more directories and subdirectories. If the pattern is followed by a /, only directories and subdirectories match.
因此,要將目錄移動
run
到頂級目錄x
,然後刪除其餘目錄,您可以執行以下操作:shopt -s globstar; mv x/**/run/ x/ && find x/ -type d -empty -delete
該
shopt
命令啟用該globstar
選項。將mv x/**/run/ x/
移動任何命名的子目錄run
(請注意,這僅在只有一個run
目錄時才有效),x
並將find
刪除任何空目錄。如果您願意,您可以在 shell 中使用擴展的 globbing 來完成整個事情,但我更喜歡安全網
find -empty
以確保不會刪除非空目錄。如果你不關心這個,你可以使用:shopt -s globstar; shopt -s extglob; mv x/**/run/ x/ && rm -rf x/!(run)