【问题标题】:find files and exclude several file endings from the result for a posix shell查找文件并从 posix shell 的结果中排除几个文件结尾
【发布时间】:2021-11-21 12:21:12
【问题描述】:

我希望有一个单行命令来递归查找文件,并能够通过文件结尾排除几种文件类型。

这是我想出的,并且有效。

find "$path" -type f \( ! -iname "*.txt" ! -iname ".*" ! -iname "*.swf" \)

但我的问题是:

  1. 如果我想排除更多文件,命令会变得很长。
  2. 我希望可以选择将所有排除的文件结尾放在一个变量中,以得到类似 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" 也许吧。
  • 是否符合-iregex posix?
  • 不,不是。 -iname 也不是
  • 为什么它必须是单个命令?您可以将一长串文件扩展名添加到文本文件中,并将 find 的输出通过管道传输到 grep -f fileextensions -v

标签: bash shell unix find posix


【解决方案1】:

假设您的文件名中没有任何换行符,您可以通过管道输出 findgrep 以使用正则表达式过滤掉不需要的换行符:

find "$path" -type f | grep -Ev '(^\.)|(\.(txt|swf)$)'

【讨论】:

  • RE 当然可以在变量中。
猜你喜欢
  • 2019-05-10
  • 2021-01-26
  • 2018-10-27
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 2013-04-25
  • 1970-01-01
相关资源
最近更新 更多