2016-04-25 88 views
0

所以我在做我的工作,我需要列出文件夹中的某些特定文件。 我键入 ls -lrt *ABCD*201604* 并且它返回 *ABCD*201604* not foundUnix命令ls -lrt给出意想不到的结果

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

因此,接下来我从列出的文件中复制了ABCD201604,同时输入命令ls -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 

在第二输出I省略其他细节,但是文件名。

+0

'* abcd * 201604 *'匹配'abcd'后跟'201604'的文件。它不匹配ACROSS文件名称。只有一个文件具有两个字符串模式,依次排列。例如'201604abcd.txt'不匹配,也不会'abcd.txt'或'201604.txt',但'abcdfoobar201604bazqux.txt'将 –

+0

复制并粘贴终端上的确切命令和输出,以便我们看到。这可能是一些微妙的东西在你的写作中丢失。(我注意到你说'ls -lrt * ABCD * 201604 *'打印了'* ABCD * 20160425 * not found'这是不正确的,因为多了'25'。最好避免重新输入以避免细微的差异这个。) –

+0

@JohnKugelman,对不起。这只是为了说明。我将添加确切的命令和输出。 –

回答

2

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

另外ASCII字符是有时很难区分像0-O(零,字母O),或1- l(One和字母L)

+0

你是说如果文件名是UTF-8编码,它不会使用我输入的命令列出?它绝对不是同形象的情况。 –

+0

@Deepak jha不,它会被列出。但是,如果有一个人物,例如看起来像A但不是ASCII A,如果你输入'ls * A *',它将不起作用,但如果你复制那个字符(它看起来像是'ls * A *',但实际上不是) –

3

壳是负责扩展命令行上的水珠。执行的命令没有看到这些通配符:它看到扩展的参数。

如果您想了解这些扩展方式,请尝试在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* 

注意,在最后一行,水珠不再扩展到一个文件名,所以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可以扩展它。

+0

我已经添加了我的情况。你能把它与你的答案联系起来吗? –

相关问题