查找不在数字列表中的文件

时间:2014-09-08 19:36:11

标签: linux bash

我有一个巨大的文件列表,这些文件当前都按顺序编号,并带有不同的文件扩展名。

3400.PDF
3401.xls
3402.doc

目录中大约有1400个这样的文件。我想知道的是如何找到序列中不存在的数字。

我曾尝试为此编写一个bash脚本,但我的bash-fu很弱。

我可以使用

获取没有扩展名的文件列表

FILES=$(ls -1 | sed -e 's/\..*$//')

但我见过的一些地方说不要以这种方式使用ls (询问后15天,我无法重新安置在我读到的地方,如果它存在的话......)

我也可以通过ls | head -n 1获取第一个文件,但我很确定我正在使这个变得更加复杂。

3 个答案:

答案 0 :(得分:3)

听起来你想做这样的事情:

shopt -s nullglob
for i in {1..1400}; do 
    files=($i.*)
    (( ${#files[@]} > 0 )) || echo "no files beginning with $i"; 
done

这使用glob来生成所有文件1.*2.*等的数组。然后它将数组的长度与0进行比较。如果没有与模式匹配的文件,则消息为打印。

启用nullglob非常重要,否则,当没有匹配数组的文件时,将包含一个元素:文字值'1.*'

答案 1 :(得分:1)

根据删除的答案基本上是正确的:

for i in $(seq 1 1400); do ls $i.* > /dev/null 2>&1 || echo $i; done

答案 2 :(得分:0)

ls [0-9]* \
| awk -F. '  !seen[$1]++ { ++N }
             END         { for (n=1; N ; ++n) if (!seen[n]) print n; else --N }
'

当它填满最后一个差距时会停止,在N>0 || n < 3000中分到至少那么远。