检查内联命令中的文件名是否存在

检查内联命令中的文件名是否存在

我有一个名为 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"。您需要$(...)像其他引用一样引用$variable,并且您可能想要删除"s。

[ -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

相关内容