Files

遞歸展平根目錄中的子目錄並維護 1 級子目錄結構

  • July 26, 2019

我有一個大型的 n 級目錄,結構如下:

root
 |
  subdir1
     |
      sub_subdir1
          |
           ....(n-2 levels).....
                                |
                                 file1
 |
  subdir2
     |
      sub_subdir2
          |
           ....(n-2 levels).....
                                |
                                 file2

我想展平目錄,以便所有 1 級子目錄都包含文件。我還想將 2 級刪除到 (n-1) sub_subdirs,因為它們不包含文件。請注意,子目錄都有不同的名稱。

期望的結果

root
 |
  subdir1
     |
      file1
 |
  subdir2
     |
      file2

我發現很多文章解釋了展平目錄的方法,但沒有一個解釋如何以受控方式執行此操作,即

  • 通過指定要展平的級別
  • 或對根目錄中的所有子目錄遞歸執行

使用 zsh:

cd /root
for subdir in subdir*
do
 mv "$subdir"/**/*(.) "$subdir"
 rm -r "$subdir"/*(/)
done

這:

  1. 更改為“/root”目錄(來自您的範例)
  2. 循環遍歷每個命名的子目錄subdir*(再次來自您的範例:匹配 subdir1 和 subdir1)
  3. 將該子目錄下的(預期的,但會匹配所有的)匹配文件移動到該子目錄中。這使用了 zsh 的**遞歸 globbing 特性,然後受 glob 限定符的限制*(.),它表示:此目錄中的任何條目都是純文件
  4. 移動文件後,遞歸刪除該子目錄下的每個子目錄;這再次使用了一個 zsh glob 限定符*(/),它表示匹配目錄條目。

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