use*_*558 2 bash array shell-script filenames
我有一个文件夹,里面有很多名为“ clip01234-randomlongstring.png ”的图片,其中01234是一个随机的五位数。我还有一个带有整数列表的数组“ clipnumbers ”。
现在我想创建一个列表“文件”,其中包含与“ clipnumbers ”数组中的数字匹配的所有文件名。我该怎么做?
结果输出应该是我可以以与我创建的当前列表(所有文件)相同的方式处理的内容:
files=($(printf "%s\n" *.* | sort -V | tr '\n' ' '))
在一个循环中:
shopt -s nullglob
files=()
for number in "${clipnumbers[@]}"; do
printf -v pattern 'clip%s-*.png' "$number"
files+=( $pattern )
done
Run Code Online (Sandbox Code Playgroud)
这会遍历数字并为每个数字创建一个文件名通配模式。扩展模式以将与其匹配的文件名添加到数组中files
。该nullglob
外壳选项使得非匹配模式扩大到什么(而不是保持未展开)。
使用find
(递归到当前目录下的所有目录,并对每个找到的文件执行一些操作):
patterns=()
for number in "${clipnumbers[@]}"; do
printf -v pattern 'clip%s-*.png' "$number"
patterns+=( -o -name "$pattern" )
done
find . -type f \( "${patterns[@]:1}" \) -exec action-to-perform-on-files {} \;
Run Code Online (Sandbox Code Playgroud)
所述:1
移除初始-o
在从列表patterns
中的扩展。
这将搜索文件与对其执行某些操作相结合。如果您的数组包含数千个数字(参数列表会变得太长),它将失败clipnumbers
。