Verifique se o nome do arquivo existe do comando inline

3

Eu tenho um arquivo chamado input.txt com este conteúdo:

...
FILE "Edie - Realities.txt" TXT
...

E eu quero lê-lo, então tire o caminho do nome do arquivo da linha que começa com FILE e verifique se ele existe, então:

[ -f $(cat input.txt | grep FILE | grep -o "\".*\"") ] && echo "exist" || echo "does not exist"

mas isso gera:

[: too many arguments  
does not exist

Se eu correr:

echo $(cat input.txt | grep FILE | grep -o "\".*\"")

Eu obtenho o que esperava:

"Edie - Realities.txt"

Então, por que isso acontece ou como posso resolver esse problema?

    
por zetah 01.03.2012 / 16:57

3 respostas

2

$(...) está evidentemente passando "Edie , - e Realities.txt" como argumentos separados. Você precisa citar $(...) como qualquer outro $variable e provavelmente deseja remover o " s.

[ -f "$(cat input.txt | grep FILE | sed 's/^.*"\(.*\)".*$//')" ] && echo "exist" || echo "does not exist"
    
por 01.03.2012 / 17:10
9

Você precisa citar o argumento para -f - se você executar com set -x , verá que o comando que está sendo executado é [ -f '"Edie' '-' 'Realities.txt"' ] , o que é muitos argumentos.

[ -f "$(sed -e '/FILE/!d' -e 's/FILE "\([^"]*\).*//' input.txt)" ]

Se você tem o GNU grep no seu sistema, você pode usar:

[ -f "$(grep -Po '(?<=FILE ").*(?=")' input.txt)" ] 
    
por 01.03.2012 / 17:13
-1

Para o conteúdo do seu arquivo

FILE "/path_to_file/filename" TXT

faça algo como

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
    
por 01.03.2012 / 21:34

Tags