我有一組特定的兩個資料夾,它們位於我的 CentOS 伺服器上的許多位置。假設這些資料夾如下所示:
aaa/bbb/cat
aaa/bbb/dog
aaa
、bbb
、cat
和的名稱和結構dog
是固定的,但它們出現在伺服器中的多個位置。例如:
/folder1/aaa/bbb/cat
/folder1/aaa/bbb/dog
/folder2/folder3/folder4/aaa/bbb/cat
/folder2/folder3/folder4/aaa/bbb/dog
etc...
我可以使用什麼命令來刪除伺服器上cat
和的每個實例中的所有文件,但僅當它們分別是和的子資料夾時,如上所示?dog
bbb
aaa
謝謝!
答案1
從 bash 4.0 開始,您可以使用shopt -s globstar
.預設情況下不啟用。
以你的例子
ls **/aaa/bbb/cat/* # globstar not enabled
給出folder1/aaa/bbb/cat/1
shopt -s globstar
ls **/aaa/bbb/cat/* # globstar ENABLED
給出
folder1/aaa/bbb/cat/1 folder2/folder3/folder4/aaa/bbb/cat/3
這是tree .
你的例子。
.
├── folder1
│ └── aaa
│ └── bbb
│ ├── cat
│ │ └── 1
│ └── dog
│ └── 1
├── folder2
│ └── folder3
│ └── folder4
│ └── aaa
│ └── bbb
│ ├── cat
│ │ └── 3
│ └── dog
│ └── 4
當然,你也可以用狗而不是貓來重複它:-)
用之前檢查ls
並用之後刪除rm
。注意:
您必須記住shopt -s globstar
在要使用該語法的每個新 shell 上啟用 globstar (),否則您可以將其放入檔案中~..bash_rc
...
答案2
跑find
兩次
find . -path "*/aaa/bbb/cat/*" -delete
find . -path "*/aaa/bbb/dog/*" -delete
或者做
find . \( -path "*/aaa/bbb/cat/*" -o -path "*/aaa/bbb/dog/*" \) -delete