누락된 파일을 검색하기 위해 파일 목록을 반복하는 방법

누락된 파일을 검색하기 위해 파일 목록을 반복하는 방법

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

관련 정보