如何找到基于不同名称的文件并在一行中删除所有文件

如何找到基于不同名称的文件并在一行中删除所有文件

我知道如何根据不同的名称查找文件。问题是我不知道如何一次性删除所有文件。我在 z/OS390 中使用 OMVS。

要查找通过不同扩展名搜索的文件,我成功执行了以下操作:

find . -name "*.xml" -o -name "*.ipm" -type f

要仅按一个名称搜索后删除文件,我成功地执行了以下操作:

find . -name "*.xml" -type f -exec rm -iv {} \;

好吧,如果我混合这两种想法,我只会删除按姓氏找到的文件:

find . -name "*.xml" -o -name "*.ipm" -type f -exec rm -iv {} \;

在这种情况下,与第一个模式 ( ) 匹配的文件似乎*.xml不受-exec rm.

四处搜寻后,我猜问题是我必须“保留”找到的所有名称执行rm.我尝试了三种方法都没有成功...

第一次尝试:

$ find . -name "*.xml" - o -name "*.ipm" -type f -print0 | xargs -0
FSUM6372 Unknown option "-"
Usage: find directory ... expression
xargs: FSUM6001 Unknown option "-0"

Usage: xargs Ý-l#¨Ý-L #¨ Ý-irepl¨Ý-I repl¨ Ý-n#¨ Ý-tpx¨ Ý-s#¨ Ý-eeof¨Ý-E eof¨ Ýc
md Ýargs ...¨¨

第二次尝试:

$ find . (-name "*.xml" - o -name "*.ipm") -type f
FSUM7332 syntax error: got (, expecting Newline

第三次尝试:

$ find . -type f \(-name "*.xml" -o -name "*.ipm"\)
FSUM6372 Unknown option "(-name"
Usage: find directory ... expression

答案1

您的括号尝试周围缺少空格,因此find看到一个名为的选项(-name,但不知道如何处理它。相反,在括号周围添加空格,例如:

find . \( -name "*.xml" -o -name "*.ipm" \) -type f -exec rm -iv {} \;

另外,如果你有 GNU,你find可以使用-delete-exec rm -iv {} \;

+正如通配符指出的,由于我们正在执行一个可以接受参数列表的命令,因此我们可以通过使用终止-exec而不是保存一些进程(可能很多取决于它匹配的频率)\;。将把路径收集到集合中,并通过一次应用程序调用(此处)来应用它们,+而不是为每个路径调用一次应用程序。因此,如果您没有或不想使用更有效的解决方案,请执行以下操作:-execrm-delete

find . \( -name "*.xml" -o -name "*.ipm" \) -type f -exec rm -iv {} +

答案2

使用括号是可行的,但您需要对它们进行转义,以便 shell 不会将它们解释为子 shell 调用。您可以使用反斜杠、\( 和 \) 或引号。

如果您的文件名称均不包含换行符或其他控制字符(除非有人试图恶意,否则应该是这种情况),那么您可以使用管道到 xargs 方法,这是最快的,无需 -print0 和 -0 选项。

相关内容