有一个线程讨论ls "*"
不显示任何文件,但我实际上想知道为什么简单
ls *
命令在我的终端中不输出任何内容,除了
ls: invalid option -- '|'
Try 'ls --help' for more information.
尽管
ls
将列出当前目录中的所有文件
1 ferol readme.txt
2 fichier sarku
2018 GameShell Templates
22223333 '-|h4k3r|-' test
3 hs_err_pid2301.log test2
CA.txt important.top.secret.txt toto.text
CA.zip JavaBlueJProject tp1_inf1070
countryInfo.txt liendur 'tp1_inf1070_A19(2) (1)'
currency liensymbolique tp1_inf1070_A19.tar
curreny LOL Videos
Desktop Longueuil 'VirtualBox VMs'
Documents Music words
douffos numbers Zip.zip
Downloads Pictures
examples.desktop Public
关于为什么通配符在这里不起作用的任何想法?我在 Ubuntu 上,在终端中工作,我不知道这是否有什么不同。
谢谢。
答案1
当你跑步时
ls *
通配符照常生效,并且*
扩展到当前目录中的所有文件名 - 包括这个:
-|h4k3r|-
以 a 开头-
,因此ls
尝试将其解析为选项(如-a
或-l
)。由于|
实际上不是 所识别的选项ls
,因此它会抱怨错误消息invalid option
,然后退出(不列出任何文件)。
如果您想明确列出当前文件夹中的所有内容,请尝试
ls ./*
...这将为所有文件名添加前缀./
(这样条目就不会被误解为选项),或者
ls -- *
...其中--
是“指示选项结束的分隔符”,即。任何剩余的参数都是文件名。
答案2
我认为这里缺少的重要概念飞跃是完成通配符的地方。ls
本身永远不会进行任何通配符操作。如果您不给它任何参数,它会假定您的意思.
并列出该目录,就像您在命令行上提供的任何目录一样。
进行通配符操作的是 shell。然后 shell 将结果作为一堆命令行参数传递给ls
.ls
不知道您是否输入了这些参数,或者它们是否是全局扩展的结果。因此它会像解析任何其他命令行参数一样解析它们的标志。
这不是 Windows 上的工作方式,我认为这是 Windows 处理命令行程序的一个主要缺陷。
这里另一个有趣的演示是创建一个包含一堆目录的目录。如果您随后执行ls *
此操作,shell 会将所有这些目录作为参数提供,并ls
为您提供每个目录的列表。这只是表明假设.
您没有提供参数是一个简单的默认行为,而不是任何特殊行为。
如果您说./*
shell*
会执行全局扩展,导致所有内容都位于./
其前面,因此ls
不会将任何参数解释为选项。如果这样做ls -- *
,ls
则将该选项解释--
为意味着它应该停止尝试处理选项并将所有其余参数视为应该列出的文件或目录。所以,恕我直言,--
是更好的选择。
--
绝大多数 Unix 命令行实用程序都遵循该约定,并且是为大多数语言编写的大多数参数解析库的标准功能。
答案3
通常该命令ls *
应列出当前工作目录中的所有文件和目录。有 2 种情况会导致您面临的问题。
如果目录中包含的任何文件包含不支持的字符,例如名为
--2
“or”的目录,-2
就会导致此类错误。例如:# ls -la | grep 2$ drwxrwxr-x 2 test test 4096 Oct 28 14:58 --2 # ls * ls: unrecognized option '--2'
这是因为以 开头的文件名将
-
被视为ls
命令的选项。如果不是这种情况,我相信您的文件中可能设置了一些别名
.bashrc
。例如,如果我设置了别名alias ls='ls –2'
,我将无法使用该ls
命令,因为它将调用无效选项-2
。
答案4
这意味着您有一个名为“-|”的文件。由于 shell(bash、ksh 等)的工作方式,所有通配符表达式都会根据当前目录中的内容进行评估前该命令被调用,所以如果你有一个名为-|,然后ls *
将被称为ls file1 file2 ... -| ...
,并且您会收到此错误。
至于如何删除或重命名它 -例如,您可以将mv './-|' xyz
其重命名为。xyz