我正在编写一个小 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