如何从目录中过滤或提取文件?

如何从目录中过滤或提取文件?

我有以下格式的文件:

abc_abc_abc   
abc_abc_abc.1    
abc_bca_bca    
abc_bca_bca.1    
abc_bca_bca.2    
abc_cab    
abc

我想获取有 2 个下划线的文件并排除其他文件,例如 . (点)和单下划线。

结果如下:

abc_abc_abc
abc_bca_bca

答案1

您可以使用find

find . -name "*_*_*" -not -name "*.*"

这也将在子目录中搜索。如果您不想要这个,请添加-maxdepth 1-type f如果您只想要常规文件:

find . -maxdepth 1 -type f -name "*_*_*" -not -name "*.*"

添加-printf "%P\n"以去掉前面的./.

答案2

使用ksh,bash -O extglobzsh -o kshglob使用一些双重否定(这里假设您还想排除具有 3 个或更多下划线的文件):

printf '%s\n' !(!(*_*_*)|*_*_*_*|*.*)

zsh -o extendedglob及其~ 除了操作员:

printf '%s\n' *_*_*~(*_*_*_*|*.*)

或使用 的zsh本机否定运算符:

printf '%s\n' ^(^*_*_*|*_*_*_*|*.*)

如果您仍然想要包含超过 2 个下划线的文件,则分别用!(!(*_*_*)|*.*)or*_*_*~*.*^(^*_*_*|*.*)代替上面的内容。

其他方法可能是!(*[._]*)_!(*[._]*)_!(*[._]*)(替换[_.].允许 3 个或更多下划线)。

答案3

简单地说,在 bash(或支持数组的 shell)中:

files=(???_???_???)

这使用?通配字符来拾取如您所示命名的文件,其中包含 3 个字符、一个下划线、3 个字符、一个下划线,然后是 3 个字符。xyz_qrs_t.1不过,如果您有一个诸如 之类的文件名,这可能会被阻止。

更精致一点的是:

files=([^._][^._][^._]_[^._][^._][^._]_[^._][^._][^._])

...它使用[^ ... ] 通配语法。每个字符都[^._]要求一个字符,即不是句点或下划线。混合有两个下划线,分隔三批,每批三个[^._]

循环它们:

for f in "${files[@]}"; do printf "File: %s\n" "$f"; done

相关内容