我有一个脚本来打开一个文本文件,其中包含 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.txt
ls -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