Comandos de encadeamento dentro de 'watch'

2

Ok, isso está me deixando um pouco maluca.

Estou tentando observar o número de arquivos em um conjunto de subdiretórios.

find . | wc -l retorna corretamente o número de subpastas e arquivos.

No entanto, watch 'find . | wc -l' retorna watch: find . | wc -l: No such file or directory na tela de exibição.
Ele retorna o mesmo com aspas duplas ou backquotes (').

Esta é uma versão antiga do bash:% GNU bash, version 3.00.16(2)-release (i486-slackware-linux-gnu)
Copyright (C) 2004 Free Software Foundation, Inc.

Este também é um dispositivo embutido, por isso está executando o busybox ( BusyBox v1.1.0 (2010.06.14-02:47+0000) multi-call binary ) ao invés dos utilitários normais do gnu, então a maioria dos switches e funcionalidades da maioria das ferramentas comuns também não estão lá.

Isso tem que ser levado em conta. No entanto, a instalação do Linux é ativada em um disco-no-módulo, portanto, não há maneira fácil de atualizá-lo.

O mesmo comando ( watch 'find . | wc -l' ) funciona corretamente em uma instalação mais recente do linux, então essa questão é mais sobre como lidar com o bash desatualizado e o que há de errado com este snippet exato (já que parece seja correto em outro lugar! ).

    
por Fake Name 01.11.2012 / 05:14

1 resposta

9

Dependendo da sua implementação / versão de watch , pode não iniciar um shell para interpretar uma linha de comando, mas, em vez disso, executa um comando que aceita como argumento os argumentos recebidos. Então, nesse caso, se você precisar executar uma linha de comando do shell, precisará iniciar um shell explicitamente como em:

watch sh -c 'find . | wc -l'

Veja também o comando inotifywait -rm . (se no Linux) para monitorar a atividade em um diretório.

Observe também que find . | wc -l retorna apenas o número de arquivos (excluindo as entradas .. ) se os nomes dos arquivos não contiverem caracteres de nova linha. Se isso pode ser um problema, você poderia fazer:

find .//. | grep -c //

Observe também que não há nenhum utilitário GNU ou Unix com o nome watch . Há um comando watch no conjunto de ferramentas procps para o Linux, há uma implementação de watch no busybox. Em BSDs, watch faz algo completamente diferente. watch não é um comando padrão (em nenhuma das especificações POSIX, Unix ou LSB).

    
por 01.11.2012 / 08:28