如何删除包含特定名称的文件或文件夹的文件夹?
例如我想删除所有包含文件“things.txt”的文件夹:
/dirA/
/dirB/things.txt
/dirC/
/dirD/things.txt
/dirE/things.txt
/dirF/
然后它将删除dirB
、、dirD
和dirE
——而不仅仅是里面的文件。
答案1
一种无需管道传输的解决方案是将目录名称传递给find
shell exec
。
这不会那么有效,而且如果目录已经被删除,它当然会尝试删除不存在的目录。
find . -depth -type f -name 'things.txt' -exec sh -c 'rm -rf "$(dirname $0)"' {} \;
如果您想使用xargs
,您可以像这样非常简单地进行操作。请注意,dirname
只接受一个参数,因此您必须指定只-n 1
传递xargs
一个参数:
find . -depth -type f -name 'things.txt' | xargs -n 1 dirname | uniq | xargs rm -rf
如果您的目录名包含换行符,这将不安全,因此请注意这一点。
答案2
这已经在 Linux 上测试过,因为下面的命令也可以在 Unix 系统上执行。
find -type f -name 'things.txt' | xargs dirname | xargs rm -r
解释:
find -type f -name 'things.txt'
--> 搜索名为“things.txt”的文件(仅文件,而不是目录)
|
--> 将结果传送到下一个命令
xargs dirname
| --> 获取文件所在的目录名然后将结果传送到下一个命令
xargs rm -r
--> 继续删除所有包含名为“things.txt”的文件的目录
瞧!