아무것도 반환하지 않는 명령의 출력에서 무언가를 에코하고 싶습니다.
fnames.txt의 내용입니다.
company_TOYOTA_666_696969696*
company_FORD_123_435345666*
company_MAZDA_333_333333333*
company_HONDA_777_777777777*
company_FERARI_999_999999999*
fnames.txt의 한 줄에서 각 파일을 찾는 스크립트는 다음과 같습니다.
#!/bin/sh
while read -r LINE
do
output=$(find . -name "$LINE")
if [[ $output ]];
then
printf "$output\n"
elif [[ $output -eq 0 ]];
then
echo "$LINE Not Found"
fi
done < /path/to/fnames.txt
하지만 실행하려고 하면 찾은 파일만 출력하고 찾을 수 없는 파일 이름을 에코하는 elif 문은 출력하지 않습니다.
./company_TOYOTA_666_696969696_11_22_33_4542352345.dat
./company_FORD_123_435345666_11_22_33_4542352345.dat
./company_MAZDA_333_333333333_11_22_33_4542352345.dat
./company_HONDA_777_777777777_11_22_33_4542352345.dat
다음과 같이 출력하고 싶습니다.
./company_TOYOTA_666_696969696_11_22_33_4542352345.dat
./company_FORD_123_435345666_11_22_33_4542352345.dat
./company_MAZDA_333_333333333_11_22_33_4542352345.dat
./company_HONDA_777_777777777_11_22_33_4542352345.dat
company_FERARI_999_999999999* Not Found
답변1
-z
및 -n
문자열 테스트 연산자를 사용할 수 있습니다 .
String operators:
-z STRING True if string is empty.
-n STRING
STRING True if string is not empty.
예를 들어
while read -r LINE; do
output=$(find . -name "$LINE")
if [[ -z "$output" ]]; then
echo "$LINE not found"
else
echo "$output"
fi
done < fnames.txt
company_TOYOTA_666_696969696* not found
./company_FORD_123_435345666asdfgh
company_MAZDA_333_333333333* not found
./company_HONDA_777_7777777771242jkk
company_FERARI_999_999999999* not found
어디
$ ls -1 company*
company_FORD_123_435345666asdfgh
company_HONDA_777_7777777771242jkk
답변2
삶을 더 쉽게 만들기 위해 코드를 활용하고 반환하는 것이 좋습니다 grep
.
while read -r LINE
do
find . -name "${LINE}" | grep "${LINE}" || echo "${LINE} not found"
done < /path/to/fnames.txt
작동 원리:
find . -name "${LINE}"
당신도 이것을 알고 있을 것입니다. 현재 디렉토리에서 일치하는 파일을 찾습니다.${LINE}
| grep "${LINE}"
출력 을grep
. 일치하는 항목이find
있으면grep
일치 항목이 인쇄되고 명령은 0을 반환합니다. 일치하는 항목이 없으면 아무것도 인쇄되지 않고 0이 아닌 반환 값이 반환됩니다.|| echo "${LINE} not found"
이는||
OR 파이프이며 이전 명령 중 하나가 0이 아닌 값을 반환하면 실행됩니다. 따라서grep
0이 아닌 값이 반환되면(즉, 일치하는 파일을 찾을 수 없는 경우) 이 에코가 수행됩니다. 이전 명령이 성공하면 실행되지 않습니다.
답변3
#!/bin/bash
while read -r LINE
do
output=$(find . -name "$LINE" 2> /dev/null)
if [[ -z $output ]]; then
echo "$LINE Not Found"
else
echo "$output"
fi
done < /path/to/fnames.txt