grep 加了星号后不知为何不显示文件名了

下载了个游戏,在图形界面剪贴到机械硬盘里,命令行用 7z 解压后,ls|grep filename* 想看看情况,却发现执行完命令之后会卡顿两三秒才显示出命令行提示符,然后没有任何文件名称和错误提示显示在屏幕上。

查看压缩包

  • $ ls -lh |grep 悠久 *
    -rwxrwxrwx 1 lsmscnm users 1.8G 4 月 28 14:00 悠久之翼.7z

用 7z 解压,显示一切正常

  • $ 7z x 悠久 *

7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=zh_CN.UTF-8,Utf16=on,HugeFiles=on,64 bits,4 CPUs Intel(R) Core™ i5-4590 CPU @ 3.30GHz (306C3),ASM,AES-NI)

Scanning the drive for archives:
1 file, 1915728642 bytes (1827 MiB)

Extracting archive: 悠久之翼.7z

Path = 悠久之翼.7z
Type = 7z
Physical Size = 1915728642
Headers Size = 969
Method = LZMA2:24 BCJ
Solid = +
Blocks = 3

Everything is Ok

Folders: 3
Files: 34
Size: 2310773935
Compressed: 1915728642

输入 ls 想查看解压好的文件夹

  • $ ls

    悠久之翼
    悠久之翼.7z

发觉台麻烦所以调出本文开头的历史命令,却发现卡顿两秒后只会重新出现命令行提示符而没有列出任何结果,试了三次都不行。

  • $ ls -lh |grep 悠久 *
  • $ ls -lh |grep 悠久 *
  • $ ls -lh |grep 悠久 *

没结果就又手动输入了 ls,正常显示。

  • $ ls

    悠久之翼
    悠久之翼.7z

手动输入 ls | grep 也正常显示。

  • $ ls |grep 悠久
    悠久之翼
    悠久之翼.7z

#grep 加上 * 号就又像刚才那样卡顿后什么都没有,只有命令行提示符重新出现

  • $ ls |grep 悠久 *
  • $ ls |grep 悠久 *
  • $ ls -l |grep 悠久 *

懵了的状态下,瞎测试想找出原因

  • $ ls -l
    总用量 53056777

    drwxrwxrwx 1 lsmscnm users 4096 5 月 23 2021 悠久之翼
    -rwxrwxrwx 1 lsmscnm users 1915728642 4 月 28 14:00 悠久之翼.7z
  • $ ls -l |grep 悠久
    drwxrwxrwx 1 lsmscnm users 4096 5 月 23 2021 悠久之翼
    -rwxrwxrwx 1 lsmscnm users 1915728642 4 月 28 14:00 悠久之翼.7z

加了 * 号的全和上面一样没反映

  • $ ls |grep 悠久 *
  • $ ls -lh |grep 悠久 *
  • $ ls -lh |grep 悠久 *
  • $ ls -lh |grep 悠久 *
  • $ ls |grep*
    如果 ‘grep*’ 不是输入错误的话,你可以使用 command-not-found 命令来查找它在哪个软件包中,就像这样: cnf grep*

总之只要 grep 命令后面加了星号就不知道为什么显示不出来。

不需要星号
加上星号命令展开后变成 grep 悠久之翼 悠久之翼.7z,结果就是去压缩包文件里查找字符串了
所以执行变慢了并且还没有结果

开源世界旅行手册

原来如此,我最近一直在犯这种不细心的问题,没脸见人了。
睡一觉就去看菜鸟教程,补基础。

什么都没显示这一点我不明白,grep 不应该是过滤然后列出用 ls 命令列出的文件中所有以悠久开头的文件吗,它的标准输入应该是 ls 的结果啊,它的输出应该也仅限于 ls 结果的范围内,为啥会去搜索压缩包,搜索压缩包之后是什么原因导致它显示不出来?

grep 只有一个参数的时候才会从标准输入里读要过滤的内容;
加星号展开后有两个参数,这时候就会把第二个及以后的参数都当成文件来读取要过滤的内容,不会去标准输入里读取了

原来如此,说实话实在看不懂 man 里的这玩意儿
grep [options] PATTERN [FILE…]
grep [options] [-e PATTERN | -f FILE] [FILE…]

man man 看一下就懂了。

原来是这样。