Encontre o resultado usado na instrução if

1

Como posso usar o resultado de um comando find em uma declaração if e comparar com true ou false?

Algo parecido com isto:

if [ 'find . -name test.txt -size 156c'="true" ]; then echo Found; fi

Este é o script inteiro:

#!/bin/bash
if [ $# -ne 2 ]
then
    echo Not enough params
fi

if [ 'find . -name $1 -size $2c | grep -q .' -eq 0 ]
then
    echo OK
fi  
    
por ABC 25.03.2015 / 15:40

3 respostas

3

Talvez simplesmente canalizar a saída de find em grep seja o suficiente:

if find . -name test.txt -size 156c | grep -q .; then echo Found; fi

A chamada para find não terá saída, a menos que um arquivo que corresponda às condições de nome e tamanho definidas seja encontrado, e grep . terá status de saída 0 ("true") somente se sua entrada não estiver vazia. A opção -q pede para não imprimir nenhuma saída, o que seria irrelevante aqui porque nos preocupamos apenas com o status de saída.

Para limpar outra possível fonte de confusão: como @derobert mencionado em um comentário, os colchetes não fazem parte da sintaxe da construção if : você descobrirá que existe um comando chamado [ , que tem a tarefa de avaliar a expressão booleana e retornar seu valor de verdade na forma de um código de saída ( [ também pode ser um shell embutido); é este comando que verifica a presença de um colchete de fechamento:

$ [ 3 -gt 2 ] ; echo $?
0

$ [ 3 -lt 2 ] ; echo $?
1

$ [ 3 -lt 2 ; echo $?
bash: [: missing ']'
2

Nos comandos acima, 0 significa verdadeiro, 1 significa falso e 2 sinaliza um erro.

    
por 25.03.2015 / 15:43
0

Como afirmei no meu comentário, presumo que a sua pergunta seja realmente

How do I use the find command to test a single file to see whether it satisfies a find test, such as size = some specified number?

em que o nome do arquivo é especificado como um parâmetro para um script (e, portanto, não é conhecido por você antecipadamente). Você está criando uma resposta em torno do comando

if find . -name "$1" -size "$2"c | grep -q .
then
    echo OK
fi

Tomei a liberdade de inserir as citações recomendadas pelo dhag. Este não é um mau começo, mas tem alguns problemas:

  1. Se o usuário executar o script com um parâmetro de test.txt e existe um arquivo chamado test.txt em um subdiretório do diretório atual , então find irá encontrá-lo e imprimirá seu caminho, e assim o grep será bem-sucedido. Mas, se o seu script está tentando fazer algo com um arquivo chamado test.txt no diretório atual, ele falhará, porque não existe esse arquivo.
    Você pode corrigir isso adicionando -maxdepth 1 para impedir que find procure em subdiretórios.
  2. Se o usuário executar o script com um parâmetro de my_subdir/test.txt , então find falhará, porque o argumento para -name não pode conter barras.
  3. Se você tem um usuário muito travesso, ele pode digitar "*" apenas para causar problemas.

Usar find . parece um pouco bobo quando você não quer pesquisar em uma árvore de diretórios. Você sabe o nome do arquivo; você só quer testar suas propriedades. Bem, se você ler entre as linhas de find(1) com um olho fechado, você percebe que nunca diz que o argumento caminho tem que ser diretórios - isso apenas implica. Acontece que você pode dizer

find  filename  [expression]

Aplicado à sua pergunta, isso se torna

find "$1" -size "$2"c

Como teste de sanidade, recomendo:

if [ -f "$1" ]  &&  find "$1" -size "$2"c | grep -q .
then
    echo OK
fi

para evitar receber uma mensagem de erro de find se o arquivo especificado não existir de todo (e para evitar que o usuário travesso mencionado de dar ao script o nome de um diretório).

    
por 26.03.2015 / 06:59
0

De maneira semelhante às soluções grep oferecidas em outro lugar, mas talvez de maneira mais simples, você pode apenas read de uma única linha de find . Isso garantirá find quits (porque read definitivamente irá) na primeira correspondência, e dará a você um valor de retorno confiável.

find . -name test.txt -size 156c | 
read -r na && echo ok || ! echo shite

... deve funcionar bem. Se find imprimir alguma coisa, ela terá uma nova linha, então read retornará verdadeiro para uma única correspondência de find , mas se find não exibir nada, então read alcançará EOF antes lendo um \n ewline e assim retornará um erro.

    
por 26.03.2015 / 07:47