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#
是算术上下文中的标准警告。
。还有其他注意事项(例如代码注入)。