如果我做:
$ ls -R
.:
4Shared/ Cloud/
./4Shared:
UFAIZLV2R7.part3.rar
./Cloud:
UFAIZLV2R7.part2.rar.part
UFAIZLV2R7.part1.rar.part
UFAIZLV2R7.part4.rar.part
如果我只想列出文件.rar
,我使用grep,它也会向我显示.rar.part
文件,这不是我的愿望。
我正在使用find
或ls **/*.rar
按照中所述解决这个问题这个线程它们工作得很好,但我想了解是否可以通过grep
.
我已经尝试过(思考EOL
):
ls -R | grep ".rar\n"
没有结果。
我认为问题在于发现greping是否被发现在该行的末尾,但我不确定。
请问这里有什么帮助吗?
答案1
锚点$
与行尾匹配。
ls -R | grep '\.rar$'
您也可以用于find
此目的:
find . -name '*.rar'
答案2
除了您的问题之外,请注意,它.rar
不仅匹配“.rar”,还匹配 .rar.
之前的每个字符(包括 )rar
。在这种情况下可能不是问题,但.
必须在正则表达式中转义。
ls -R | grep "\.rar$"
答案3
您还可以指示grep
从单词边界开始查找字符串。之间存在这样的边界.
(a非词字符)和r
(一个单词特点)。根据您的grep
实现,单词边界运算符可以是\b
或可能是\<
或[[:<:]]
(仅单词的左侧边界)\>
或[[:>:]]
(右侧)。
$ ls -R | grep '\brar$'
例子
假设我有这个样本数据。
$ ls -1
afile.rar
xrar
UFAIZLV2R7.part1.rar.part
UFAIZLV2R7.part2.rar.part
此命令将仅查找具有扩展名的文件.rar
。
$ ls -R | grep '\brar$'
afile.rar
这是如何运作的?
元字符
\b
是一个锚点,就像插入符号和美元符号一样。它在称为“单词边界”的位置进行匹配。该匹配的长度为零。
这不起作用的情况
如果您有名为blah-rar
这些的文件,也会被检测到。
$ ls -R | grep '\brar$'
afile-rar
afile.rar
这是因为字母数字以外的字符通常被视为边界字符,因此会跳过此方法。
答案4
做就是了 :
ls -1R -I"?" -I"??" -I"???" -I"*[!.][!r][!a][!r]"
grep
你根本不需要。
笔记:上面的方法有效......但它仍然得到至少 afile-rar
我不明白为什么。我会把它留在这里,但我并不为此感到自豪。无论如何,正如其他人所说:
find . '*.rar'