问题要我列出所有存储的文件,/usr/bin
其中文件名仅包含小写英文字母并包含单词“file”。
例如,nsrfile
并且file
应该在输出中
这是我实现这一目标的代码
ls /usr/bin | grep '\<[a-z]*file[a-z]*\>'
这是我得到的部分结果。
file
nsrfile
grub2-file
systemd-tmpfiles
但是,问题是文件名应该只包含小写英文字母,而不是斜杠-
甚至grub2-file
包含一个数字
我应该如何更改我的命令?
我会做什么:
解释 :
是一个反向 grep。有两种模式:
[0-9]
和-
期望与警告
你的任务可能期望你
grep
输出ls
,也许是这样的:在您要求
ls
文件名的地方,然后grep
过滤以 ( ) 开头^
和以 ( ) 结尾的过滤器,它们$
只有小写字母——零个或多个 (*
);然后,您要求xargs
grep 字符串“file”的每个传入文件名。一旦任何文件名(不太可能在 /usr/bin 中)包含换行符,就会立即遇到麻烦。(其中包含空格的文件
Some File Name
将被 grep 排除。)举一个人为的例子来说明这一点:在上面的示例中,
ls
将以下内容写入 grep 的管道:grep 正确地将这两个“文件名”通过管道传递给 xargs,然后它认为它有两个文件名要 grep 反对,所以它运行:
...然后抱怨丢失的文件。
建议
虽然这不是预期的,但我建议使用以下更安全的选项,假设是 bash shell:
这将打开bash 的扩展通配功能。然后,您要求在 /usr/bin 中不( ) 匹配模式的文件中
grep
列出-l
包含字符串 "file" 的文件名 ( ) :"anything ( ) 后跟任何单个 ( ) 非 ( ) -小写字母 ( ),后跟任何 ( )。换句话说,仅包含名称中仅包含小写字母的文件。!
*
[ ... ]
^
a-z
*
两种解决方案:
一个外壳循环:
这首先会生成一个
/usr/bin
基本名称匹配的路径名列表,*file*
然后测试这些基本名称是否还包含不是小写字母的字符。如果没有找到非小写字母,则打印路径名。这也可能会找到满足条件的目录名称。如果那不是想要的,那就做
在
case
语句之前跳过每个不是常规文件的名称。使用 GNU
find
:这也进行了两级过滤。首先在必须匹配的 basename 上
*file*
,然后在路径名的末尾(-regex
与完整的路径名匹配)以确保那里只有小写字母。您已接近目标,只需将“字边界”(\<>)限制更改为行首和行尾(^$)限制,一切都会好起来的:
即:从每行的开头开始查找包含任意数量的小写字母 (az) 零次或多次后跟单词文件和小写字母的行,直到行尾。
请注意,上述命令对于带有换行符的文件名将无法正常工作。