런타임 매개변수는 다음과 같습니다: $1은 파일 목록이 포함된 파일의 경로 $2는 파일이 포함된 디렉터리의 경로 $1에 나열된 각 파일이 $2 디렉터리에 있는지 확인하고 싶습니다.
나는 다음과 같은 것을 생각하고 있습니다 :
for f in 'cat $1'
do
if (FILEEXISTSIN$2DIRECTORY)
then echo '$f exists in $2'
else echo '$f is missing in $2' sleep 5 exit
fi
done
$1
보시다시피, 나열된 파일 중 하나라도 해당 디렉토리에 없으면 $2
스크립트가 해당 파일을 가리킨 다음 닫히도록 하고 싶습니다. 제가 유일하게 이해하지 못하는 부분은 바로 이 (FILEEXISTSIN$2DIRECTORY)
부분입니다. 나는 당신이 이것을 할 수 있다는 것을 알고 있지만 그것이 디렉토리 [ -e $f ]
에 존재하는지 어떻게 확인하는지 모르겠습니다 .$2
답변1
이것쉘 웨이, 다음과 같이 작성합니다.
comm -23 <(sort -u < "$1") <(ls -A -- "${2%/}/")
(셸이 ksh, zsh 또는 bash와 같은 프로세스 교체를 지원한다고 가정)
comm
두 개의 정렬된 파일 사이의 공통 행을 보고하는 명령입니다. 탭으로 구분된 3개의 열에 표시됩니다.
- 첫 번째 파일의 줄만
- 두 번째 파일의 줄만
- 두 파일에 공통되는 줄
-1
, -2
및 -3
옵션을 사용하여 해당 열을 삭제할 수 있습니다.
따라서 위에서는 첫 번째 열만 보고합니다. 즉, 파일 목록에는 있지만 출력에는 없는 줄만 보고합니다 ls
( ls
기본적으로 파일 목록은 정렬되어 있으며 파일 이름에 개행 문자가 포함되어 있지 않다고 가정합니다).
zsh
당신은 그것을 사용할 것 입니다${A:|B}
배열 빼기운영자:
#! /bin/zsh -
files_in_list=(${(f)"$(<$1)"})
files_in_dir=(${2%/}/*(ND:t))
print -rC1 -- ${files_in_list:|files_in_dir}
답변2
파일의 행을 반복하는 가장 좋은 방법은 read
while 루프에 내장된 함수를 사용하는 것입니다. 이것이 당신이 찾고 있는 것입니다:
while IFS= read -r f; do
if [[ -e $2/$f ]]; then
printf '%s exists in %s\n' "$f" "$2"
else
printf '%s is missing in %s\n' "$f" "$2"
exit 1
fi
done < "$1"
답변3
echo "Inquire if each file of a file list exists in a specific directory"
foundc=0
nfoundc=0
fflist=""
nflist=""
DIR_A='./my_directory' # address directory used as target of searching
FILELIST='./file_list.txt' # file with: list of file names to search
### echo "for file in $FILELIST"
exec 3< $FILELIST # associa lista_arquivos ao descritor 3
while read file_a <&3; do
if [[ -s "$DIR_A/${file_a}" ]];then # file is found and is > 0 bytes.
foundc=$((foundc + 1))
fflist=" ${fflist} ${file_a}"
## echo '...file ' "${file_a}" 'was found...'
else # file is not found or is 0 bytes
nfoundc=$((nfoundc + 1))
nflist=" ${nflist} ${file_a}"
echo '...file ' "${file_a}" 'was not found...'
fi
done
exec 3<&- # libera descritor 3
echo "List of found files: " "${fflist}" "
echo "List of NOT found files: " "${nflist}" "
echo "Number of files in "[$FILELIST]" found = [${foundc}] "
echo "Number of files in "[$FILELIST]" NOT found = [${nfoundc}] "
exit