2013-04-05 74 views
3

鑑於以下文件通配符單個文件

$ ls 
bar.txt baz.txt qux.txt 

我想只有第一個txt文件保存到一個變量。我想這

$ var=*.txt 

,但它只是保存所有文件

$ echo $var 
bar.txt baz.txt qux.txt 

我想這樣做,如果可以使用通配符,extglob是好的。這裏的文件在名稱中沒有空格,但我希望解決方案也適用於帶空格的文件。

使用kamituel’s answer後,我意識到,這可能工作太

$ set *.txt 

$ echo $1 
bar.txt 

回答

8

使用此:這裏

$ var=(*.txt) 
$ echo $var 
bar.txt 

關鍵是要用括號 - 將這種元件陣列。因此echo $var將打印陣列中的第一個元素(bar.txt)。你可以看到,通過打印整個數組:

$ echo ${var[@]} 
bar.txt baz.txt qux.txt 
+1

如果沒有'* .txt'文件,'var =(* .txt)''之前可能需要'shopt -s nullglob'。 – pynexj 2013-04-05 11:46:16

0

可以(略)濫用for語句來設置變量:

$ for var in *.txt; do break; done 
$ echo $var 
bar.txt 

從有利的一面,var只包含的名稱第一個文件,不是所有匹配模式的文件。另一方面,這比kamituel提供的數組解決方案更加冗長,存儲所有匹配文件的開銷在現實生活中不太可能成爲問題。

+0

這實際上很有趣,但對「下一個傢伙」來說如此邪惡,很難認可它。 :) – 2013-04-05 14:17:09

0
$ touch "test file1.txt" 
$ touch "test file2.txt" 
$ var=`ls *.txt | head -1` 
$ echo $var 
test file1.txt` 

這將返回第一個文件。

要找到最後一個,請執行「ls -r」而不是「ls」或「tail -1」而不是「head -1」。

+0

http://mywiki.wooledge.org/ParsingLs – 2013-04-06 06:40:12