通配符单个文件

时间:2013-04-05 06:30:02

标签: bash glob

给出以下文件

$ 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

3 个答案:

答案 0 :(得分:9)

使用此:

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

这里的关键是使用括号 - 将元素放入数组中。所以echo $var打印出数组中的第一个元素(bar.txt)。您可以通过打印整个数组来看到:

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

答案 1 :(得分:0)

您可以(稍微)滥用for语句来设置变量:

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

在正面,var仅包含第一个文件的名称,而不是与模式匹配的所有内容。从负面来看,这比kamituel提供的数组解决方案更加冗长,存储所有匹配文件的开销在现实生活中不太可能成为问题。

答案 2 :(得分: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”。