따라서 나는 특정 파일이 존재하는지 확인하는 방법을 이미 알고 있습니다.
if [ -f ~/file1 ]; then echo "is there" ; else echo "not there" ; fi
if [ -f ~/file2 ]; then echo "is there" ; else echo "not there" ; fi
그리고 두 파일이 모두 존재하는 경우:
[[ -f file1 && -f file2 ]] && echo "both" || echo "not"
그러나 내가 모르는 것은 두 개의 서로 다른 파일이 존재하는지 확인하면서 둘 중 하나가 존재하거나 둘 다 존재하면 각각의 이름을 인쇄하거나 둘 다 존재하지 않으면 오류를 인쇄하는 방법입니다... ...)
하도록 하다:
file1은 존재하지만 file2는 존재하지 않는 경우 -> file1을 기존 파일로 인쇄하고 그 반대의 경우도 마찬가지입니다.
file1과 file2가 존재하는 경우 -> 해당 파일 이름을 인쇄합니다.
존재하지 않는 경우 -> 해당 파일 이름은 존재하지 않는 것으로 인쇄됩니다.
답변1
나는 이것을 반복해서 할 것이다:
for pathname in ~/file1 ~/file2; do
if [ -e "$pathname" ]; then
printf '"%s" exists\n' "$pathname"
else
printf '"%s" does not exist\n' "$pathname"
fi
done
이는 기본적으로 루프 헤더에 언급된 각 경로 이름의 존재에 대해 단일 테스트를 수행하고 테스트 결과에 따라 출력할 내용을 결정합니다. 출력에는 확인된 경로 이름과 테스트 결과가 언급되어 있습니다.
경로 이름이 간단한 패턴과 일치하는 경우 루프에서 사용할 수 있습니다.
for pathname in ~/file[12]; do ...; done
이 질문은 다음과 같이 해석될 수도 있습니다. 기존의 모든 경로 이름을 인쇄합니다. 그러나 파일이 없으면 모든 경로 이름과 존재하지 않는다는 설명을 인쇄합니다.
set -- ~/file1 ~/file2
found=false
for pathname do
if [ -e "$pathname" ]; then
printf '"%s" exists\n' "$pathname"
found=true
fi
done
if ! "$found"; then
printf '"%s" does not exist\n' "$@"
fi
여기서는 확인하려는 경로 이름을 포함하는 목록으로 위치 인수 목록을 사용하고 있습니다. 테스트에서 한 번, 파일이 존재하지 않는 경우 -e
호출에서 다시 (암시적으로) 이 목록을 반복할 수 있기 때문에 이렇게 합니다 .printf
대신 배열을 사용하십시오 bash
(더 많은 입력이 필요함).
files=( ~/file1 ~/file2 )
found=false
for pathname in "${files[@]}"; do
if [ -e "$pathname" ]; then
printf '"%s" exists\n' "$pathname"
found=true
fi
done
if ! "$found"; then
printf '"%s" does not exist\n' "${files[@]}"
fi
files=( ~/file1 ~/file2 )
다음과 같이 쓸 수도 있음 을 참고하세요 .
files[0]=~/file1
files[1]=~/file2
-f
테스트와 테스트에 대한 설명입니다 -e
. 테스트 -e
는 존재 여부를 확인하고, -f
테스트는 존재 여부를 확인합니다.그리고파일 유형. 경로 이름이 일반 파일(또는 일반 파일에 대한 심볼릭 링크)을 참조하지 않는 경우 테스트는 -f
거짓일 수 있지만 -e
동시에 테스트는 참일 수 있습니다. "일반 파일"은 디렉터리, 소켓, 명명된 파이프 또는 기타 일반적인 Unix 파일 형식이 아닌 파일입니다.
파일 형식에 대해 언급하지 않고 질문에 "exists"라는 단어를 반복적으로 사용했기 때문에 답변에 있는 테스트 -e
대신 테스트를 선택했습니다 .-f