我的 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
给出文件夹 1/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
当然,您也可以用 dog 代替 cat 来重复此操作 :-)
检查 with 之前的内容ls
,并在 with 之后删除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