Directory

辨識兩個不同目錄之間的公共子目錄名稱並刪除它們

  • October 30, 2016

我有兩個目錄dir1dir2其中有數百個子目錄depth 1dir1我只需要dir2dir2. 我不需要比較文件或文件內容。表演

diff -qr dir_one dir_two | sort

也產生文件名,我目前不感興趣。

對於您的案例,您可以避免辨識公共目錄,因為rm -rf只是忽略不存在的目錄。

因此,將find 所有目錄從以下dir1位置刪除 就足夠了dir2

find dir1 -mindepth 1 -maxdepth 1 -type d -printf "dir2/%f\0" |xargs -0 rm -rf --

一些解釋。預設情況下find,將列印所有具有完整路徑的目錄,即dir1. 所以我們-printf只列印文件名,沒有前導目錄(%f)加上我們要刪除的其他路徑“dir2”。此外,我們使用空字節 ‘\0’ 而不是換行符來終止字元串以使用xarg選項-0,這使得所有這些對於帶空格的文件名都是安全的。然後xargs將讀取標準輸入並rm通過添加所有字元串作為參數來執行命令。

請注意,在實際刪除它們之前,您可以通過添加echo僅列印命令來測試您的命令行rm

find dir1 -mindepth 1 -maxdepth 1 -type d -printf "dir2/%f\0" |xargs -0 echo rm -rf --

列出您可以使用的公共目錄,ls而不是rm(添加 2>/dev/null 以忽略不存在的目錄):

find dir1 -mindepth 1 -maxdepth 1 -type d -printf "dir2/%f\0" |xargs -0 -r ls -d -- 2>/dev/null

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