파일 목록의 파일이 디렉터리에 존재하는지 확인

파일 목록의 파일이 디렉터리에 존재하는지 확인

런타임 매개변수는 다음과 같습니다: $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. 두 파일에 공통되는 줄

-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

파일의 행을 반복하는 가장 좋은 방법은 readwhile 루프에 내장된 함수를 사용하는 것입니다. 이것이 당신이 찾고 있는 것입니다:

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

관련 정보