在这种情况下,GNU find
允许您一次完成所有这些操作,从而消除了管道和潜在的麻烦的解析ls
:
find . -maxdepth 1 -name '[^.]*' \
-regextype posix-extended -regex "MYPATTERN" \
-printf 'SOMEPREFIX %f SOMESUFFIX\n'
(当然,find
这不是随意修改其他命令输出的好方法!)
一些注意事项:
-maxdepth 1
和-name [^.]*
化妆名称匹配的工作一样普通ls
(或ls .
)。您可以使用任何Shell样式的Glob,但是请注意,“ *”将匹配前导“”。†的名称†与不同bash
,[^.]*
表示没有前导“”的任何内容。
- MYPATTERN是正确的POSIX ERE(默认类型为Emacs,请参见此处),但是它必须与整个文件名匹配,因此请使用
.*thing.*
代替代替thing
- 您可能只可以使用
-name
/ 之一,-regex
而不要同时使用两者(例如-regex“ [^。]。MYPATTERN。 ”
-printf
支持很多东西,%n
是未经修饰的文件或目录名称
†(这可能取决于您的版本find
,请查看手册页的“标准符合性”部分)
作为一种可能的替代方案,不需要外部程序,它bash
具有compgen
扩展glob的功能,等效于ls
没有选项的:
compgen -P "someprefix>" -S "<somesuffix" -G "pattern"
这将处理带有空格的文件名,包括换行符。compgen -G "*"
应该提供与普通输出相同的输出ls
(但请注意,ls *
这完全是另一回事)。您仍然需要grep
,这可能会或可能不会解决问题,但是值得一提。
ls
-这是个坏枣。另外,必须grep
吗?能否给出一些示例输出?