如何循环遍历文件中的列表以搜索丢失的文件

如何循环遍历文件中的列表以搜索丢失的文件

我有一个脚本来打开一个文本文件,其中包含 1650 个站点位置的列表。我试图循环遍历此列表,打印两个单独的文件列表:1)找到的文件列表和2)丢失的文件列表。站点位置列表是一列。我遇到的问题是脚本没有读取输入文件并循环通过它。该脚本只是查找单个文件“而不是读取并循环该文件的每一行”。

#!/bin/bash
file=Sites-1.txt
do
if "$file" ;
then
  echo "$file found" >> found.tmp
else
  echo "$file has not been found" >> missing.tmp
fi
done

来自 Sites-1.txt 的输入示例,用于查找文件

01-033-0043-SO2-2014.dat.out
01-033-0044-SO2-2014.dat.out
01-033-1002-SO2-2014.dat.out
01-071-0020-SO2-2014.dat.out
01-071-0026-SO2-2014.dat.out

预期输出文件组成

found.tmp
01-033-0043-SO2-2014.dat.out found
01-033-0044-SO2-2014.dat.out found 
01-071-0026-SO2-2014.dat.out found
missing.tmp
01-033-1002-SO2-2014.dat.out has not been found
01-071-0020-SO2-2014.dat.out has not been found

答案1

如果Sites-1.txt每行包含一个文件名,并且当前目录中的文件名都不包含换行符,则可以执行以下操作:

comm -23 <(sort -u Sites-1.txt) <(ls -A)

报告的输出中u存在和不存在的特殊行。Sites-1.txtls -A

或者与zsh

expected=( ${(f)"$(<Sites-1.txt)"} )
  actual=( *(ND) )
 missing=( ${expected:|actual} )

print -rC1 -- $missing

答案2

您的脚本没有检查任何有用的内容。if "$file"不检查文件是否存在,您需要使用-e "$file"它。不过,您仍然只需检查该列表是否存在。

您可能正在寻找这样的脚本:

#!/bin/bash
filelist=sites-1.txt

for file in $(cat $filelist); do
if [ -e "$file" ]
then
  echo "$file found" >> found.tmp
else
  echo "$file has not been found" >> missing.tmp
fi
done

相关内容