Linux

刪除文件夾內的所有文件夾,但具有特定名稱的文件夾除外

  • April 29, 2021

我需要使用每日腳本刪除文件夾內的所有文件夾。那天的文件夾需要留下。

文件夾“myfolder”有 3 個子文件夾:“test1”、“test2”和“test3”我需要刪除除“test2”之外的所有文件夾。

我想在這裡匹配確切的名稱:

find /home/myfolder -type d ! -name 'test2' | xargs rm -rf

或者

find /home/myfolder -type d ! -name 'test2' -delete

此命令也總是嘗試刪除主文件夾“myfolder”!有沒有辦法避免這種情況?

這將刪除./myfolder除此之外的所有文件夾,./myfolder/test2並保留其所有內容:

find ./myfolder -mindepth 1 ! -regex '^./myfolder/test2\(/.*\)?' -delete

這個怎麼運作

  • find啟動查找命令。
  • ./myfolder告訴 find 從目錄./myfolder及其內容開始。
  • -mindepth 1 不匹配./myfolder自己,只是它下面的文件和目錄。
  • ! -regex '^./myfolder/test2\(/.*\)?' 告訴 find 排除 ( !) 任何匹配正則表達式的文件或目錄^./myfolder/test2\(/.*\)?^匹配路徑名的開頭。該表達式 (/.*\)?匹配 (a) 斜線後跟任何內容或 (b) 什麼都不匹配。
  • -delete 告訴 find 刪除匹配的(即非排除的)文件。

例子

考慮一個看起來像這樣的目錄結構;

$ find ./myfolder
./myfolder
./myfolder/test1
./myfolder/test1/dir1
./myfolder/test1/dir1/test2
./myfolder/test1/dir1/test2/file4
./myfolder/test1/file1
./myfolder/test3
./myfolder/test3/file3
./myfolder/test2
./myfolder/test2/file2
./myfolder/test2/dir2

我們可以執行 find 命令(不帶-delete)來查看匹配的內容:

$ find ./myfolder -mindepth 1 ! -regex '^./myfolder/test2\(/.*\)?'
./myfolder/test1
./myfolder/test1/dir1
./myfolder/test1/dir1/test2
./myfolder/test1/dir1/test2/file4
./myfolder/test1/file1
./myfolder/test3
./myfolder/test3/file3

我們可以通過查看剩餘的文件來驗證這是否有效:

$ find ./myfolder
./myfolder
./myfolder/test2
./myfolder/test2/file2
./myfolder/test2/dir2

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