임시 파일에서 파일 이름을 변수로 사용하여 디렉터리에서 파일 이름을 찾을 수 없습니다.

임시 파일에서 파일 이름을 변수로 사용하여 디렉터리에서 파일 이름을 찾을 수 없습니다.

파일 이름이 포함된 샘플 CSV 파일이 있습니다.

f1
f2
f3

디렉토리에서 이 파일 이름을 검색하고 싶습니다. 아래 코드는 다음과 같습니다.

while read f1
do
  ls -t | grep "$f1"
  if[ $? = 0 ]
  then
    echo file exists
  else 
    echo file does not exists
  fi

done<sample.csv

어떻게 든 $f1변수 값은 빈 값을 얻는 것을 대체하지 않습니다.

답변1

ls명령은 파일이 존재하는지 테스트하는 것이 아니라 디렉터리의 내용을 나열합니다. 또한 일반적으로 grep파일 이름 작업에는 적합하지 않습니다. 왜냐하면 파일 이름에는 기술적으로 개행 문자가 포함될 수 있기 때문입니다(그리고 grep텍스트 파일을 사용하는 대부분의 유틸리티와 마찬가지로 줄 기반 도구이기 때문입니다).

또한 테스트에 구문 오류가 있습니다 if(선행 공백 누락 [).

댓글에 따르면, 입력 파일도 DOS 텍스트 파일입니다. 이는 파일에서 읽은 각 줄의 끝에 추가 캐리지 리턴이 있음을 의미합니다. 이는 Unix 스크립트(또는 다른 Unix 도구)가 파일을 읽을 때 캐리지 리턴이 읽은 데이터의 일부가 됨을 의미합니다. . 이 특정 스크립트의 경우 이는 파일에서 읽은 파일 이름이 파일 시스템의 기존 파일 이름과 일치할 가능성이 거의 없음을 의미합니다(캐리지 리턴은 실제로 Unix 파일 이름에서 작동하지만 오류 외에 다른 파일 이름은 거의 또는 전혀 본 적이 없음).

변환 유틸리티를 사용하여 DOS 텍스트 파일을 Unix 텍스트 파일 형식으로 변환할 수 있습니다 dos2unix.


파일이 존재하는지 테스트하려면 -e다음 테스트를 사용하십시오 [ ... ].

while IFS= read -r name; do
    if [ -e "$name" ]; then
        printf '%s exists\n' "$name"
    else
        printf '%s does not exist\n' "$name"
    fi
done <sample.csv

이는 파일이 sample.csv한 줄에 하나의 파일 이름 또는 경로 이름을 포함한다고 가정합니다.

답변2

코드에 세미콜론/줄바꿈이 누락되어 전혀 작동하지 않습니다. if 뒤에 공백이 없습니다. 이 문제를 해결하면 다음과 같은 라이너를 얻을 수 있습니다.

while read f1; do ls -t | grep "$f1"; if [ $? = 0 ]; then echo file exists; else echo file does not exists; fi; done

세미콜론이 있는 곳에 줄바꿈을 사용할 수도 있는데, 그러면 읽기가 더 쉬워집니다. (하지만 코드는 여러분 가까이에 보관하겠습니다.) 이제 잘 작동합니다. 예를 들어, 저장하면 test.sh예상대로 작동합니다. 예를 들어

$ echo test.sh | bash test.sh
test.sh
file exists

답변3

zsh다음과 같은 스크립트를 작성할 수 있습니다 .

#! /bin/zsh -
# list of files to find on stdin or in file arguments, LF delimited
to_find=(${(f)"$(cat -- "$@")"})
in_current_dir=(*(ND))

# print files in both lists, LF delimited:
print -rC1 -- ${in_current_dir:*to_find}

관련 정보