인라인 명령에 파일 이름이 있는지 확인하세요.

인라인 명령에 파일 이름이 있는지 확인하세요.

다음 내용이 포함된 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

관련 정보