Como verificar se 'ls' produz alguma coisa… com um único comando?

2

TL / DR : estou trabalhando no Solaris 10. Tenho um comando ls ... | egrep ... e preciso saber se ele gera resultados ou não. Eu poderia apenas adicionar um | wc -c ao final; mas preciso que o resultado (0 ou diferente de zero) esteja no código de saída, não na saída. E não posso usar if , não é um script bash, só posso executar um único comando.

Versão longa : estou escrevendo um processo de manutenção para compactar e remover arquivos de log antigos em um sistema Solaris 10. Ele verifica todos os arquivos .log ou .xml dentro de um determinado caminho, pega os que foram modificados pela última vez em um determinado mês, cria um .tar com eles e remove os arquivos originais:

ls -Egopqt /path/ | egrep -i '2016-10-[0123][0-9] .*(\.log$|\.xml$)' | awk '{ print $7 }'
| xargs tar -cvf target.tar

E o mesmo para remover os arquivos, apenas substituindo a última parte por: | xargs -i rm {}

Provavelmente estou complicando demais, mas funciona. A menos que não haja arquivos para um determinado mês; Se esse for o caso, recebo um erro dizendo tar: Missing filenames . Como posso verificá-lo antes de tentar criar o tar? Pensei em algo assim, usando o wc para verificar se há uma saída ou não :

ls ... | egrep ... | wc -c

Que produz corretamente 0 quando não há arquivos e outro número. O problema é: Não consigo ver a saída, apenas o código de saída (que é sempre 0, pois não há erro). Eu não estou fazendo isso em um script bash, eu estou trabalhando com o Siebel CRM: Eu tenho uma função de javascript que gera os comandos e executa-los com Clib.system . A única coisa que consigo ver é o código de saída: 0 para OK, diferente de zero para um erro (vejo o número real, não "diferente de zero").

Anteriormente, eu tinha uma opinião semelhante, para verificar se um arquivo único existe ou não, e essa resposta me ajudou a chegar a isso:

[ -f filename ] && exit 111 || exit 0

Estou obtendo com sucesso 111 ou 0 , dependendo do nome do arquivo existir ou não. Mas não consigo fazer isso funcionar com o comando ls ... | egrep ... | wc . Eu tentei usar esta sintaxe :

[[ $( ls -Egopq /path/ | egrep -i ... | wc -c ) -ne 0 ]] && exit 111 || exit 0

Mas estou sempre recebendo o código de saída 2, não importa se há arquivos ou não. O que estou fazendo errado?

PS: Eu sei que eu poderia escrever um pequeno script de shell para executar as verificações, usar um if simples para comparar a saída e retornar o código de saída desejado. Além disso, eu realmente posso acessar a saída de um comando, só preciso redirecioná-lo para um > tempfile e depois lê-lo no Siebel. No entanto, prefiro evitar essas duas opções, já que estou tentando evitar a criação de arquivos desnecessários (temporários ou permanentes).

    
por AJPerez 22.11.2016 / 18:25

2 respostas

6

egrep retornará diferente de zero se nenhuma linha for correspondida.

    
por 22.11.2016 / 18:29
1

De xargs manual:

--no-run-if-empty
-r     If  the standard input does not contain any nonblanks, do not run the command.  
       Normally, the command is run once even if there is no input.  This option is a GNU extension.

Parece que ... | xargs -r tar -cvf target.tar deve fazer o truque!

    
por 22.11.2016 / 18:32