Como posso ecoar uma saída de um comando que retorna nada / nulo?

0

Gostaria de fazer um eco de uma saída de um comando que não retorna nada.

Este é o conteúdo do fnames.txt

company_TOYOTA_666_696969696*
company_FORD_123_435345666*
company_MAZDA_333_333333333*
company_HONDA_777_777777777*
company_FERARI_999_999999999*

Este é o meu script para encontrar cada arquivo em uma linha do 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

Mas quando eu tento executá-lo, ele só exibe os arquivos que ele encontrou e não a declaração elif que echo é o nome do arquivo que ele não encontrou:

./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

Eu gostaria que saísse disso:

./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
    
por WashichawbachaW 07.07.2017 / 04:21

3 respostas

2

Eu recomendaria alavancar grep e códigos de retorno para tornar a vida um pouco mais simples.

while read -r LINE
do
    find . -name "${LINE}" | grep "${LINE}" || echo "${LINE} not found"

done < /path/to/fnames.txt

Como isso funciona:

  • find . -name "${LINE}" tem certeza que você conhece este, encontre arquivos no diretório atual que correspondam a ${LINE}
  • | grep "${LINE}" canaliza a saída para grep . Fazemos isso para produzir um valor de retorno, que find normalmente não produz um valor útil. Se o grep corresponder a alguma coisa, a correspondência será impressa e o comando retornará 0. Se nada for correspondido, nada será impresso e retornará um valor de retorno diferente de zero.

  • || echo "${LINE} not found" O || é um canal OR, se um dos comandos antes de retornar um valor diferente de zero, ele será executado. Portanto, se o grep retornar diferente de zero (ou seja, nenhum arquivo correspondente foi encontrado), esse eco será executado. Se os comandos antes de sucedê-lo, ele não será executado.

por 07.07.2017 / 14:49
3

Você pode usar os operadores de teste -z e -n :

String operators:

  -z STRING      True if string is empty.

  -n STRING
     STRING      True if string is not empty.

por exemplo,

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

onde

$ ls -1 company*
company_FORD_123_435345666asdfgh
company_HONDA_777_7777777771242jkk
    
por 07.07.2017 / 04:32
0
#!/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
    
por 07.07.2017 / 05:12