如何将所有具有相同后缀的文件放入一个表中?

如何将所有具有相同后缀的文件放入一个表中?

我正在编写一个小 shell 脚本,我想将所有具有相同后缀的文件存储在一个表中。

我想要这样的东西:

path=/home/user/Documents
suffix="_suffix.txt"

然后是一个创建表名文件的函数,并用 $path 中带有 $suffix 后缀的文件填充它。结果:

echo files[0]

-> /home/user/Documents/project_suffix.txt

echo files[1]

-> /home/user/Documents/html_suffix.txt

echo files[2]

-> /home/user/Documents/jokes_suffix.txt。等等...

我不想在我的列表中包含其他文件,例如“budget.txt”

谢谢您的回答!;)

答案1

bash使用最新版本的通配符数组,我认为您所说的表格就是这个意思。

首先创建一些测试文件:

path=/some/where
touch $path/{a,b,c}_suffix.txt

_suffix.txt下面是将所有以 结尾的文件放入数组的示例files

files=("$path"/*_suffix.txt)

要对它们进行迭代,你可以执行以下操作:

for file in "${files[@]}"; do
  echo "$file"
done

或者:

for i in ${!files[@]}; do
  echo "${files[i]}"
done

请注意,文件名中包含空格和换行符会导致此方法出现问题。在这种情况下,最好使用find and-print0循环,请参阅这个答案举个例子这篇文章了解详情。

编辑

正如所指出的穆鲁,空白问题可能不再像以前那么严重,YMMV。

答案2

所谓的表通常称为数组或映射。在 Bash 中,要创建这样的大批

path="/home/user/Documents"
suffix="_suffix.txt"
files=( "$path"/*"$suffix" )

*是一个通配符,它被 shell 扩展为所有匹配的文件名($path前后都有$suffix)。括号 ( ()) 将扩展的文件名转换为数组。

"${files[0]}"然后您可以使用、"${files[1]}"等访问每个元素(从 0 开始索引,而不是 1)。

例如:

$ path=/tmp
$ suffix=_amd64.deb
$ files=( "$path"/*"$suffix" )
$ echo "${files[1]}" "${files[0]}" 
/tmp/vim-athena_7.4.640-1~ppa1~t_amd64.deb /tmp/vim_7.4.640-1~ppa1~t_amd64.deb

相关内容