我用 find 制作了一个文本文件,其中包含具有 .mp3 和 .wma 扩展名的外部硬盘驱动器上的所有内容。我想尝试在文件上使用 grep 以查看没有前面目录的文件(只是行本身,它看起来不那么混乱)。但是,当我输入以下内容时:
grep -h "*.mp3" mp3sCIR.txt
什么都没有弹出。是的,它拼写正确,并且文件确实包含列表。我尝试删除 -h 仍然没有。Egrep 可以工作,但不会像请求的那样抑制文件名/路径。
我用 find 制作了一个文本文件,其中包含具有 .mp3 和 .wma 扩展名的外部硬盘驱动器上的所有内容。我想尝试在文件上使用 grep 以查看没有前面目录的文件(只是行本身,它看起来不那么混乱)。但是,当我输入以下内容时:
grep -h "*.mp3" mp3sCIR.txt
什么都没有弹出。是的,它拼写正确,并且文件确实包含列表。我尝试删除 -h 仍然没有。Egrep 可以工作,但不会像请求的那样抑制文件名/路径。
首先,您似乎误解了
-h
标志的作用。-h
将禁止在命令行上传递的文件的名称(即mp3sCIR.txt
- 尽管只给出一个文件时,默认情况下不打印名称) - 它不会从文件名中删除任何内容文件。其次,您混淆了 shell 模式(又名“globs”)和正则表达式 - grep 使用正则表达式语法,因此要将文件名与
.mp3
您需要的扩展名匹配1(无论有没有 ,它都应该工作相同
-E
,因为基本形式和扩展形式是相同的)。要删除前导路径名组件(即您尝试使用的内容
-h
),您可以使用仅打印不包括路径分隔符的匹配部分,或在 perl 兼容 (PCRE) 模式下使用grep
为了将来参考,您可以使用' 的输出格式保存名称而不使用前导路径组件。
find
-printf '%f\n'
[1] 实际上,BRE 似乎将
*
模式开头的裸字符视为文字,而 ERE(即egrep
/grep -E
)似乎将其视为空表达式的量词(“零个或多个无实例”);因此grep -E "*.mp3"
确实匹配带有.mp3
后缀的条目 - 但不是出于您可能认为的原因。