Unix命令ls -lrt给出了意想不到的结果

时间:2016-04-25 21:12:59

标签: linux ls

所以我正在做我的工作,我需要在文件夹中列出一些特定的文件。 我打字了 ls -lrt *ABCD*201604* 它又归来了 *ABCD*201604* not found

然后看看这些文件是否真的存在,我做ls -lrt并发现有这样的文件。

接下来,我在输入命令ABCD时从列出的文件中复制了201604ls -lrt *ABCD*201604*,这很有用!

我比较了我的两个命令,看看我是否犯了任何错误,但发现两者完全相同。对此类行为有何解释?

我写的一篇:

$ ls -lrt *RFPTDW*20160425*
*RFPTDW*20160425* not found

我复制的一个:

$ ls -lrt *RFPTDW*20160425*
RFPTDW107_01_01_20160425_1526.txt
RFPTDW059_01_01_20160425_1527.txt

在第二个输出中,我省略了其他细节但文件名。

2 个答案:

答案 0 :(得分:3)

shell负责在命令行上扩展globs。执行的命令看不到那些通配符:它看到扩展的参数。

如果要查看这些内容是如何展开的,请尝试使用echo预先添加所需的命令。像这样:

$ touch ABCD
$ touch 201604
$ touch foo_ABCD_bar_201604_baz
$ echo ls -lrt *ABCD*
ls -lrt ABCD foo_ABCD_bar_201604_baz
$ echo ls -lrt *201604*
ls -lrt 201604 foo_ABCD_bar_201604_baz
$ echo ls -lrt *ABCD*201604*
ls -lrt foo_ABCD_bar_201604_baz
$ rm foo_ABCD_bar_201604_baz
$ echo ls -lrt *ABCD*201604*
ls -lrt *ABCD*201604*

请注意,在最后一行,glob不再扩展为文件名,因此ls命令将被赋予参数*ABCD*201604*,该参数命名一个不存在的文件。

编辑:

如果您将echo添加到实际命令中,我希望您的结果为

$ echo ls -lrt *RFPTDW*20160425*
ls -lrt *RFPTDW*20160425*

在第一种情况下,

$ echo ls -lrt *RFPTDW*20160425*
ls -lrt RFPTDW107_01_01_20160425_1526.txt RFPTDW059_01_01_20160425_1527.txt

在第二种情况下。在第一种情况下,文件不存在,因此glob不会扩展为任何内容。在第二种情况下,一些文件与glob匹配,因此shell可以扩展它。

答案 1 :(得分:2)

有时字符编码就是问题所在。 Unicode中的字符看起来与ASCII字符完全相同(所谓的同形字符)。所以也许有“特殊”字符只有在你复制粘贴时才有效。

有时很难区分ASCII字符,如0-O(零,字母O)或1 - A=zeros(5,factorial(5)^5)(单字母和字母L)