我有一个包含大量图像的文件夹,名为“ clip01234-randomlongstring.png ”,其中01234是一个随机的五位数字。我还有一个带有整数列表的数组“ clipnumbers ”。
现在我想创建一个列表“文件”,其中包含与“ clipnumbers ”数组中的数字匹配的所有文件名。我该怎么做?
结果输出应该是我可以用与我创建的当前列表(所有文件)相同的方式处理的东西:
files=($(printf "%s\n" *.* | sort -V | tr '\n' ' '))
在一个循环中:
这会循环数字并为每个数字创建一个文件名通配模式。该模式被扩展以将与其匹配的文件名添加到数组
files
中。shell 选项使不匹配的nullglob
模式扩展为空(而不是保持未扩展)。使用
find
(用于递归到当前目录下的所有目录,并对每个找到的文件执行一些操作):从扩展中的列表中
:1
删除首字母。-o
patterns
这结合了搜索文件和对它们执行一些操作。如果您的数组包含数千个数字,它将失败
clipnumbers
(参数列表会变得太长)。选项1
类似于Kusalananda 的答案,但使用数组扩展而不是循环:
设置
请注意,该数组仅包含两个预期匹配的项目;有些文件名包含不存在的剪辑,并且其中的剪辑编号
array
不作为文件名存在。执行
请注意在第一个作业中仔细包含双引号,而在第二个作业中没有双引号。初始分配通过将字符串添加到每个元素,将数字的“array”数组转换为部分文件名的“pfiles”数组。
clip
第二个赋值将通配符附加-*.png
到数组的每个元素上;在这个赋值中缺少引用允许 shell 拆分每个元素$IFS
(通常是空格、制表符和换行符),但我们暂时将 IFS 覆盖为空。然后,shell 还会“globs”结果,这就是我们在这里想要的——因为它将“clip...*-png”名称扩展为任何匹配的文件名。随着nullglob
shell 选项集,任何不匹配的通配符都会被丢弃。最终结果是 pfiles 中的一个数组,其中包含与原始数组中的剪辑编号匹配的文件。选项 #2
(ab) 使用扩展通配符:
这是通过将 IFS 设置为管道符号来实现的
|
,以便随后对p
of的赋值array[*]
连接 by 管道的元素array
(此时 $IFS 的第一个字符)。管道是 bash 的扩展通配符语法在扩展通配符模式中的选项之间需要的分隔符。最后一行扩展为与我们构建的扩展 glob 模式匹配的文件数组:clip
p
-
任何东西.png
如果您的
nullglob
剪辑数组不与任何现有文件名重叠,则需要 shell 选项。与
zsh
:这将每个剪辑编号扩展一个 glob。或者,您可以将数组转换为 glob 交替运算符:
使用GNU
grep
和printf
:可以将其分配给这样的数组:
mapfile -t files
将行作为数组读入文件,去除尾随换行符。shopt -s nullglob
将不存在的模式扩展为空字符串printf "%s\n" ...
扩展模式,每行一个。$(printf "clip%s-*.png " "${arr[@]}") )
构建模式。