Bash 按顺序查找以数字命名但缺少的文件
假设目录中的文件是以数字命名的,我如何找到丢失的数字 例如,在当前目录中Bash 按顺序查找以数字命名但缺少的文件,bash,Bash,假设目录中的文件是以数字命名的,我如何找到丢失的数字 例如,在当前目录中 $ ls 0000.png 0002.png 0004.jpg 0005.png 0007.jpg 缺少0001、0003和0006 谢谢 for i in {0000..0007}; do [ ! -e ${i}.* ] && echo "$i"; done 输出: 0001 0003 0006 0001 0003 0006 先决条件:不应存在具有相同前缀的文件(例如0003.png和0003.jp
$ ls
0000.png 0002.png 0004.jpg 0005.png 0007.jpg
缺少0001
、0003
和0006
谢谢
for i in {0000..0007}; do [ ! -e ${i}.* ] && echo "$i"; done
输出:
0001
0003
0006
0001
0003
0006
先决条件:不应存在具有相同前缀的文件(例如0003.png和0003.jpg)。您可以在
bash
中使用类似的脚本:
shopt -s extglob
shopt -s nullglob
arr=( +([0-9]).@(jpg|png) )
for (( i=10#${arr[0]%.*}; i<=10#${arr[-1]%.*}; i++ )); do
printf -v f "%04d" $i;
[[ ! -f "$(echo "$f".*)" ]] && echo "$f is missing"
done
0001 is missing
0003 is missing
0006 is missing
shopt-s extglob
shopt-s nullglob
arr=(+([0-9])@(jpg|png))
对于((i=10#${arr[0]].*};i这是我的答案:关键点是通过将0
添加到$1,强制将整数作为seen
数组的索引,通过适当使用ls和FS,可以保证整数
关于跟踪最大值,应该对输入进行排序,但谁知道
编辑
ls[0-9][0-9][0-9][0-9].*awk-F.
为了忠实地考虑OP请求,我修改了代码的第一行
ls [0-9][0-9][0-9][0-9].{png,jpg} | awk -F. '
/./ { seen[$1+0] = 1; m = $1>m ? $1 : m }
END { for(i=0;i<m;i++) {
printf( seen[i]? "" : "No file named %4.4d.{png,jpg} in here\n",i)}}'
ls[0-9][0-9][0-9][0-9]。{png,jpg}|awk-F.'
/./{seen[$1+0]=1;m=$1>m?$1:m}
结束{for(i=0;i如何尝试find/your folder path/-name 000*
?是否有jpg/png以外的扩展名?是否有多个文件具有相同的编号但不同的extesnion?等等…但这将根据文件名进行调整。如果文件名为0070.jpg
,则此脚本也需要更改。[0-9]*.jpg
错误。它将匹配,例如,名为0something.jpg
。您需要(+([0-9]).jpg)
或(+([:digit:]).jpg)
。您还需要shopt-s nullglob
并显式检查数组是否为空。此外,无需计算数组长度即可获得arr
的最后一个字段:${arr[-1]}
。如果第一个文件是,例如,0009.jpg
,或者最后一个文件是,例如,0109.jpg
,那么你的算术也会有错误。谢谢@gniourf\u gniourf:所有这些都是我的建议。我在回答中做了相应的更改。我不确定你为什么现在使用排序。glob+([0-9]).jpg
将很高兴地对它们进行排序。但是您仍然存在一些算术错误:请在仅包含文件0009.jpg
和0109.jpg
的目录中尝试。要解决此问题,您需要在for
中显式指定基数10
,并使用:for((i=10#${arr[0]].jpg};顺便说一句,您没有满足OP关于扩展名的要求:文件可以有扩展名.jpg
或.png
。您需要将glob更改为+([0-9])。@(jpg | png)
,并使用更通用的模式删除扩展名。10#
是算术上下文中的标准警告。)
。还有其他注意事项(例如代码注入)。