找到一系列编号文件中的第一个丢失文件

时间:2017-03-18 06:55:12

标签: linux bash shell

我有包含文件的目录:

$> ls blender/output/celebAnim/
0100.png  0107.png  0114.png  0121.png  0128.png  0135.png  0142.png  0149.png  0156.png  0163.png  0170.png  0177.png  0184.png  0191.png  0198.png  0205.png  0212.png  0219.png  0226.png  0233.png  0240.png  0247.png  0254.png  0261.png  0268.png  0275.png  0282.png
0101.png  0108.png  0115.png  0122.png  0129.png  0136.png  0143.png  0150.png  0157.png  0164.png  0171.png  0178.png  0185.png  0192.png  0199.png  0206.png  0213.png  0220.png  0227.png  0234.png  0241.png  0248.png  0255.png  0262.png  0269.png  0276.png  0283.png
0102.png  0109.png  0116.png  0123.png  0130.png  0137.png  0144.png  0151.png  0158.png  0165.png  0172.png  0179.png  0186.png  0193.png  0200.png  0207.png  0214.png  0221.png  0228.png  0235.png  0242.png  0249.png  0256.png  0263.png  0270.png  0277.png  0284.png
0103.png  0110.png  0117.png  0124.png  0131.png  0138.png  0145.png  0152.png  0159.png  0166.png  0173.png  0180.png  0187.png  0194.png  0201.png  0208.png  0215.png  0222.png  0229.png  0236.png  0243.png  0250.png  0257.png  0264.png  0271.png  0278.png
0104.png  0111.png  0118.png  0125.png  0132.png  0139.png  0146.png  0153.png  0160.png  0167.png  0174.png  0181.png  0188.png  0195.png  0202.png  0209.png  0216.png  0223.png  0230.png  0237.png  0244.png  0251.png  0258.png  0265.png  0272.png  0279.png
0105.png  0112.png  0119.png  0126.png  0133.png  0140.png  0147.png  0154.png  0161.png  0168.png  0175.png  0182.png  0189.png  0196.png  0203.png  0210.png  0217.png  0224.png  0231.png  0238.png  0245.png  0252.png  0259.png  0266.png  0273.png  0280.png
0106.png  0113.png  0120.png  0127.png  0134.png  0141.png  0148.png  0155.png  0162.png  0169.png  0176.png  0183.png  0190.png  0197.png  0204.png  0211.png  0218.png  0225.png  0232.png  0239.png  0246.png  0253.png  0260.png  0267.png  0274.png  0281.png

对于某些脚本,我需要找出第一个丢失文件的编号。在上面的输出中,它将是0285.png。但是,它们之间的文件也可能丢失。最后,我只对数字285感兴趣,它是文件名的一部分。

这是恢复逻辑的一部分:文件应由脚本创建,但此步骤可能会失败。因此,我希望能够检查哪些文件丢失,并尝试在第二步中创建它们。

这是我到目前为止所得到的(来自how to extract part of a filename before '.' or before extension):

ls blender/output/celebAnim/ | awk -F'[.]' '{print $1}'

我无法弄清楚的是如何在某个偏移之上找到该结果中缺少的最小数字?在这种情况下,偏移量为100。

4 个答案:

答案 0 :(得分:3)

您可以将所有数字从100循环到500并检查相应的文件是否存在;如果它没有,你打印出你正在查看的号码:

for i in {100..500}; do
    [[ ! -f 0$i.png ]] && { echo "$i missing!"; break; }
done

对于您的示例,这会打印285 missing!

例如,通过循环零填充数字然后提取未填充的数字,可以使此解决方案更加灵活:

for i in {0100..0500}; do
    [[ ! -f $i.png ]] && { echo "${i##*(0)} missing!"; break; }
done

这需要shopt -s extglob模式的扩展整数(*(0))(" 0"的零次或多次重复。)

答案 1 :(得分:1)

begin=100
end=500
for i in `seq $begin 1 $end`; do
  fname="0"$i".png"
  if [ ! -f $fname ]; then
    echo "$fname is missing"
  fi
done

答案 2 :(得分:1)

#!/bin/sh

search_dir=blender/output/celebAnim/

ls $search_dir > file_list

count=`wc -l file_list | awk '{ print $1 }'`

if [[ $count -eq 0 ]]
then
        echo "No files in given directory!"
        break
fi

file_extension=`head -1 file_list | tail -1 | awk -F "." '{ print $2 }'`
init_file_value=`head -1 file_list | tail -1 | awk -F "." '{ print $1 }'`
i=2

while [ $i -le $count ]
do
        next_file_value=`head -$i file_list | tail -1 | awk -F "." '{ print $1 }'`
        next_value=$((init_file_value+1));

        if [ $next_file_value -ne $next_value ]
        then
                echo $next_value"."$file_extension
                break
        fi

        init_file_value=$next_value;
        i=$((i+1));
done

答案 3 :(得分:0)

试一试:

ls blender/output/celebAnim/ | sort -r | head -n1 | awk -F'.' '{print $1+1}'

命令return 285

如果需要返回0285而不是尝试:

ls blender/output/celebAnim/ | sort -r | head -n1 | awk -F'.' '{print 0($1+1)}'