2016-04-25 27 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

我已經添加了我的情況。你能把它與你的答案聯繫起來嗎? –

相關問題