Linux
刪除文件夾內的所有文件夾,但具有特定名稱的文件夾除外
我需要使用每日腳本刪除文件夾內的所有文件夾。那天的文件夾需要留下。
文件夾“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