用于从某些子目录中删除特定文件的Bash脚本

时间:2016-06-16 00:23:10

标签: bash shell unix

在unix服务器上,我试图弄清楚如何从以v0开头的任何子目录中删除文件,例如" example.xls"(" v0 *& #34)。

我尝试过类似的事情:

find . -name "v0*" -type d -exec find . -name "example.xls" -type f 
-exec rm {} \;

但我得到错误。我有一个解决方案,但它运行得很好,即它将删除任何子目录中的文件,无论它的名称如何:

find . -type f -name "example.xls" -exec rm -f {} \;

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您可能需要分两步完成 - 即首先找到目录,然后找到文件 - 您可以使用xargs将其设置为一行,例如

find . -name "v0*" -type d | \
   xargs -l -I[] \
       find [] -name "example.xls" -type f -exec rm {} \;

它的作用是,首先生成一个可行的目录名列表,然后让xargs调用第二个find,其中包含在该目录中定位文件名的名称

答案 1 :(得分:2)

尝试:

find -path '*/v0*/example.xls' -delete

这仅匹配名为example.xls的文件,该文件在其路径中的某个位置具有以v0开头的父目录名。

请注意,由于find提供-delete作为操作,因此无需调用外部可执行文件rm

实施例

考虑这个目录结构:

$ find .
.
./a
./a/example.xls
./a/v0
./a/v0/b
./a/v0/b/example.xls
./a/v0/example.xls

我们可以识别名为example.xls的父目录之一的文件v0*

$ find -path '*/v0*/example.xls'
./a/v0/b/example.xls
./a/v0/example.xls

要删除这些文件:

find -path '*/v0*/example.xls' -delete

替代方案:仅在目录v0*

下直接查找这些文件
find -regex '.*/v0[^/]*/example.xls'

使用上述目录结构,此方法返回一个文件:

$ find -regex '.*/v0[^/]*/example.xls'
./a/v0/example.xls

删除此类文件:

find -regex '.*/v0[^/]*/example.xls' -delete

兼容性

虽然我的测试是使用GNU find执行的,但POSIX需要-regex-pathOSX也支持{。}}。