파일 이름이 포함된 샘플 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}