다음 내용이 포함된 input.txt라는 파일이 있습니다.
...
파일 "Edie - Realities.txt" TXT
...
나는 그것을 읽고 FILE로 시작하는 줄에서 파일 이름 경로를 제거하고 그것이 존재하는지 확인하고 싶습니다.
[ -f $(cat input.txt | grep FILE | grep -o "\".*\"") ] && echo "exist" || echo "does not exist"
그러나 이것은 다음과 같이 출력됩니다.
[: too many arguments
does not exist
내가 실행하면 :
echo $(cat input.txt | grep FILE | grep -o "\".*\"")
나는 내가 기대한 것을 얻습니다:
"Edie - Realities.txt"
그렇다면 이것이 왜 발생하며 어떻게 해결할 수 있습니까?
답변1
인수를 인용해야 합니다 -f
. 실행하면 set -x
실행 중인 명령에 [ -f '"Edie' '-' 'Realities.txt"' ]
인수가 너무 많다는 것을 알 수 있습니다.
[ -f "$(sed -e '/FILE/!d' -e 's/FILE "\([^"]*\).*/\1/' input.txt)" ]
시스템에 GNU grep이 있으면 다음을 사용할 수 있습니다.
[ -f "$(grep -Po '(?<=FILE ").*(?=")' input.txt)" ]
답변2
$(...)
"Edie
분명히 , -
및 를 별도의 매개변수로 전달합니다 Realities.txt"
. $(...)
다른 것과 마찬가지로 인용 해야 하며 s를 $variable
제거할 수도 있습니다 ."
[ -f "$(cat input.txt | grep FILE | sed 's/^.*"\(.*\)".*$/\1/')" ] && echo "exist" || echo "does not exist"
답변3
귀하의 파일 콘텐츠에 대한
FILE "/path_to_file/filename" TXT
다음과 같은 일을 해라
grep FILE input.txt | while read line
do
fname=`echo $line | awk -F\" '{print $2}'` # this separates the line by the quotes
# result is like /path_to_file
echo $fname # just to check it
if [ -f $fname ]
then
ls -l $fname
echo "file exists"
else
echo "no file there $file"
fi
done