'se' declaração com stdout && passando xargs pelo pipe

0

Digamos que eu tenha um list.txt dos arquivos que desejo verificar.

cat list.txt

e para cada arquivo, quero realizar uma ação

cat list.txt | xargs -I {} touch {}

Mas, dependendo do resultado da ação, quero reagir de acordo:

cat list.txt | xargs -I {} touch {} | if [-z - ]; then echo "blank file"; fi;

Isso não funciona corretamente, e não sei por que não ... Então, como posso testar corretamente o valor de stdout -? -  - e, como bônus, como eu poderia passar o conteúdo de {} para a parte final? Para o efeito de:

cat list.txt | xargs -I {} touch {} | if [-z - ]; then echo "{} is a blank file"; fi;

Talvez isso deva ser um script bash completo, mas eu preferiria que pudesse aprender a fazer isso em uma linha, já que os aplicativos para isso poderiam ser úteis de várias maneiras -

Aqui está um exemplo mais prático:

time john -incremental -stdout | grep 'clientsWeakPassword' | if [ ! -z - ]; then exit 0;

Assim, esse script geraria senhas aleatoriamente e pararia quando atingisse a senha especificada, exibindo a quantidade de tempo necessária para 'decifrar' essa senha ...

E, idealmente, também seria produzido algo como "'clientsWeakPassword' levou o Xminutes a decifrar usando adivinhações aleatórias" -

Mas essa cadeia também pode ser usada para verificar uma determinada coisa nos arquivos de log, etc, etc, etc. -

De qualquer forma, espero que alguém me aponte na direção certa.

Muito obrigado -

    
por rm-vanda 13.10.2014 / 21:04

1 resposta

1

Se você quiser fazer mais de uma coisa, gerar um shell:

xargs -t sh -c '
    for f; do
        touch "$f"
        [ -s "$f" ] || echo "$f is zero size or does not exist" 
    done
' - < list.txt

Mas, a essa altura, é melhor usar um loop while read em vez de xargs.

    
por 13.10.2014 / 21:28