Directory

如何確保目錄只有特定的子目錄?

  • July 9, 2020

我有一個目錄,其中包含一些包含文件的子目錄。我有另一個目錄,它具有非常相似的子目錄,但可能會添加或刪除一些子目錄。如何添加和刪除子目錄以使兩個目錄具有相同的結構?

有沒有一種簡單的方法可以使用命令或工具來做到這一點?還是我必須做一些更複雜的事情,比如搜尋每個子目錄並檢查它是否有匹配的?

對於這個答案,我使用了以下工具:

  • 重擊
  • comm
  • find
  • xargs

我建議您使用最後 3 個實用程序的 GNU 版本,因為它們可以處理 NUL 分隔的記錄。

首先,讓我們聲明一些變數。有必要在所有這些變數中使用絕對路徑名,因為我們將多次更改目錄:

# The directories that will be compared
original_dir='/path/to/original/directory'
copy_dir='/path/to/copy/directory'

# Text files where we will save the structure of both directories
original_structure="${HOME}/original_structure.txt"
copy_structure="${HOME}/copy_structure.txt"

# Text files where we will separate each subdirectory
# depending on the action we will perform on them
dirs_to_add="${HOME}/dirs_to_add.txt"
dirs_to_remove="${HOME}/dirs_to_remove.txt"

保存兩個目錄的目前結構:

cd -- "${original_dir}"
find . \! -name '.' -type 'd' -print0 | sort -z > "${original_structure}"

cd -- "${copy_dir}"
find . \! -name '.' -type 'd' -print0 | sort -z > "${copy_structure}"

保存兩種結構之間的差異:

comm -23 -z -- "${original_structure}" "${copy_structure}" > "${dirs_to_add}"
comm -13 -z -- "${original_structure}" "${copy_structure}" > "${dirs_to_remove}"

創建缺少的目錄:

cd -- "${copy_dir}"
xargs -0 mkdir -p -- < "${dirs_to_add}"

刪除不需要的目錄:

cd -- "${copy_dir}"
xargs -0 rm -rf -- < "${dirs_to_remove}"

刪除我們為保存時間資訊而創建的文本文件:

rm -- "${original_structure}" "${copy_structure}"
rm -- "${dirs_to_add}" "${dirs_to_remove}"

筆記

  • 此方法僅複製結構。它不保留所有者、權限或屬性。我讀到其他一些工具,比如rsync,可以保留它們,但我沒有使用它們的經驗。
  • 如果要將上面的程式碼放入腳本中,請確保實現錯誤處理。例如,未能cd進入目錄並在不正確的目錄中操作可能會導致災難性後果。

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