【发布时间】:2021-11-21 12:21:12
【问题描述】:
我希望有一个单行命令来递归查找文件,并能够通过文件结尾排除几种文件类型。
这是我想出的,并且有效。
find "$path" -type f \( ! -iname "*.txt" ! -iname ".*" ! -iname "*.swf" \)
但我的问题是:
- 如果我想排除更多文件,命令会变得很长。
- 我希望可以选择将所有排除的文件结尾放在一个变量中,以得到类似
exclude="(*.txt|*.swf|.*)"; find "$path" -type f \( ! -iname "$exclude" \)的内容(我知道这段代码不起作用,但作为我试图得到的解释。)
如上所述,我无法找到符合 posix 标准并且能够递归查找文件并且能够通过文件结尾排除文件的短单行命令,这让我抓狂。
我找到的最接近的解决方案是https://stackoverflow.com/a/22558474,但在此解决方案中,一个文件用于存储要排除的文件。所以它不是单行命令。
提前致谢!
【问题讨论】:
-
使用
-iregex而不是-iname(并参考-regextype上的man页面以及匹配范围(完整路径与基本名称))。然后,您可以使用更短的语法,例如.*/[^.][^/]*\.(txt|swf|whatever|blah)。 -
pattern='*\.(txt|swf)$'; find "$path" -type f ! -regextype posix-egrep -regex "$pattern"也许吧。 -
是否符合
-iregexposix? -
不,不是。 -iname 也不是
-
为什么它必须是单个命令?您可以将一长串文件扩展名添加到文本文件中,并将 find 的输出通过管道传输到
grep -f fileextensions -v
标签: bash shell unix find posix