Bash 按文件编号查找丢失的文件?

Bash 按文件编号查找丢失的文件?,bash,shell,if-statement,for-loop,command,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 for i in $(seq 1 1000) ; do if [i not in *.txt]; then

我有一个很大的有序文件列表,上面有这样的名字

file_1.txt
file_2.txt
file_3.txt
file_6.txt
file_7.txt
file_8.txt
file_10.txt
for i in $(seq 1 1000) ;

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

done
在这种情况下,很容易看到缺少文件:
file_4.txt
file_5.txt
file_9.txt
,但是如果我有一个大的列表,我如何找到缺少的文件?我只是在学习bash,所以我只知道一些简单的例子。像这样

file_1.txt
file_2.txt
file_3.txt
file_6.txt
file_7.txt
file_8.txt
file_10.txt
for i in $(seq 1 1000) ;

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

done
但是,如果[i not in*.txt],这甚至不起作用,除非我清除
;然后
行 所以它只写1到1000之间的所有数字。 我希望你能帮助我。
提前感谢。

一种方法是

## 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

  • 您可以在此处找到有关
    […]
    的信息: 方括号

如果它们在一个文件中,那么这应该是可行的

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

@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"}'
或者,如果您更喜欢以两步方式进行,那么将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
ls*.txt>filelist.txt
awk'match($0,/([0-9]+)/,a){a[1]>max&&max=a[1];b[a[1]+}

END{for(i=1;iHuh?您的
find
正在文件系统中查找,但OP希望在文本文件中查找文件列表-不需要文件系统访问…您可能希望
grep
在列表中。@MarkSetchell我不确定OP在查找什么。.此输入以前不在这里;)考虑周围的<代码> $Listist<代码>双引号以防文件中有空格。您好,谢谢您的帮助,但是我尝试了这个,但是它返回了每一个$i,每个数字在1到10之间,它们在一个目录中。