从文件夹中获取给定扩展名的第一个文件

时间:2014-05-02 08:22:21

标签: bash

我需要将第一个文件放在具有.tar.gz扩展名的文件夹中。我提出了:

FILE=/path/to/folder/$(ls /path/to/folder | grep ".tar.gz$" | head -1)

但我觉得它可以做得更简单,更优雅。有更好的解决方案吗?

5 个答案:

答案 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上使用)。