我有以下格式的文件:
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 extglob
或zsh -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