Directory

如何從遞歸目錄中提取特定命名的文件夾,刪除其他文件夾?

  • February 9, 2019

我有這種通過解壓縮 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-pathszip 選項,無論是在壓縮還是解壓縮時)

我會這樣做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)

引用自:https://unix.stackexchange.com/questions/349243