按号码查找丢失的文件?

时间:2015-03-31 06:07:14

标签: bash shell if-statement for-loop command

我有一个很大的有序文件列表,其名称如下

file_1.txt
file_2.txt
file_3.txt
file_6.txt
file_7.txt
file_8.txt
file_10.txt

在这种情况下,很容易看到文件:file_4.txtfile_5.txtfile_9.txt丢失,但如果我有一个大清单,我怎样才能找到丢失的文件?我只是在学习bash,所以我只知道一些简单的例子。像这样

for i in $(seq 1 1000) ;

do  
  if [i not in *.txt];  then                                                                                                     
  echo $i;

done

但除非我删除if [i not in *.txt];then行,否则这甚至不起作用 所以它只写出1到1000之间的所有数字。 我希望你能帮助我。 提前谢谢。

3 个答案:

答案 0 :(得分:1)

如果它们在文件中,那么这应该有效

awk 'match($0,/([0-9]+)/,a){a[1]>max&&max=a[1];b[a[1]]++}
     END{for(i=1;i<max;i++)if(!b[i])print "file_"i".txt"}' file

输出

file_4.txt
file_5.txt
file_9.txt

答案 1 :(得分:0)

实现此目的的一种方法是

## TODO: You need to change the following path:
THELIST=/path/to/input-file

for i in $(seq 1 10); 
do 
  FOUND=`grep "file_$i.txt" "$THELIST"` #look for file $i in $THELIST
                                        #Note: double quotes were placed around $THELIST 
                                        #      in case there is whitespace in the filename 

  [[ "$FOUND" == "" ]] && echo $i     #if what you found is empty, then output $i
done

答案 2 :(得分:0)

@ user4453924的建议确实帮助了我。它不必在文件中,只需将ls的输出通过管道传输到他的awk命令中,就可以了:

ls *.txt | awk 'match($0,/([0-9]+)/,a){a[1]>max&&max=a[1];b[a[1]]++}
 END{for(i=1;i<max;i++)if(!b[i])print "file_"i".txt"}'

输出:

file_4.txt
file_5.txt
file_9.txt

或者,如果您希望以两步方式进行操作,则将ls的输出通过管道传输到文件中,然后直接在文件上使用他的命令非常简单,就像这样:

ls *.txt > filelist.txt
awk 'match($0,/([0-9]+)/,a){a[1]>max&&max=a[1];b[a[1]]++}
 END{for(i=1;i<max;i++)if(!b[i])print "file_"i".txt"}' filelist.txt