2017-03-18 50 views
0

我有一个包含目录下的文件:查找一系列编号文件的第一个丢失的文件

$> 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.

+0

数量不一定要是285'和可以是任何数字'0100-0285'一般来说? – Inian

+0

是的。整体范围在100到500之间。如果所有数字都存在,我就完成了。 – hotzst

回答

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“)。

+0

不错,简洁。但是,如果上下边界被定义为常量,for循环将不起作用。为此@Arash的提议效果更好。 – hotzst

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 
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 
+0

不错。但是它确实会错过一些例如根本没有或只有一个文件。 – hotzst

+0

雅正确。我将编辑它以添加角落案例。谢谢 :) –

0

尝试:

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

命令返回285

如果需要返回0285比试试吧:

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