我需要将第一个文件放在具有.tar.gz
扩展名的文件夹中。我提出了:
FILE=/path/to/folder/$(ls /path/to/folder | grep ".tar.gz$" | head -1)
但我觉得它可以做得更简单,更优雅。有更好的解决方案吗?
答案 0 :(得分:14)
您可以获取数组中的所有文件,然后获得所需的文件:
files=( /path/to/folder/*.tar.gz )
获取第一个文件:
echo "${files[0]}"
获取最后一个文件:
echo "${files[${#files[@]}-1]}"
您可能希望设置shell选项nullglob
以处理没有匹配文件的情况:
shopt -s nullglob
答案 1 :(得分:3)
您可以使用set
,如下所示。 shell将展开通配符,set
会将文件指定为位置参数,可以使用$1
,$2
等进行访问。
# set nullglob so that if no matching files are found, the wildcard expands to a null string
shopt -s nullglob
set -- /path/to/folder/*.tar.gz
# print the name of the first file
echo "$1"
正如您所做的那样parse ls
不是一个好习惯,因为它不会处理包含换行符的文件名。此外,grep
是不必要的,因为您只需执行ls /path/to/folder/*.tar.gz | head -1
。
答案 2 :(得分:2)
这是您自己想法的较短版本。
FILE=$(ls /path/to/folder/*.tar.gz| head -1)
答案 3 :(得分:2)
以下是实现目标的方法:
for FILE in *.tar.gz; do break; done
在第一次迭代中,只要将第一个文件名分配给bash
,就告诉break
FILE
循环。
另一种方法:
first() { FILE=$1; } && first *.tar.gz
在这里,您使用的函数first
的位置参数优于set
整个bash过程的位置参数(与set --
一样)。
答案 4 :(得分:1)
这是一个基于find
的解决方案:
$ find . -maxdepth 1 -type f -iname "*.tar.gz" | head -1
其中:
.
是当前目录-maxdepth 1
表示仅检查当前目录-type f
表示仅查看文件-iname "*.tar.gz"
表示对扩展名为.tar.gz
的任何文件进行不区分大小写的搜索| head -1
接受find的结果,仅返回第一行您可以执行以下操作来摆脱| head -1
:
$ find . -maxdepth 1 -type f -iname "*.tar.gz" -maxdepth 1 -print -quit
但是我实际上不确定-print -quit
在各种环境下的可移植性(虽然可在MacOS和Ubuntu上使用)。