passa variável canalizada para perl oneliner

0

se você tem algo como:

find . -d -maxdepth 1 | wc -l | perl ...

de que maneiras você tem que dizer ao perl para pegar essa variável que está vindo em sua direção e subtrair 1?

Eu tentei subtrair 1, já que o find está contando muito 1.

    
por xyz 02.04.2013 / 15:49

3 respostas

4

Perl seria um exagero aqui.

find . -maxdepth 1 -mindepth 1 | wc -l

(use melhor grep -c / em vez de wc -l no caso de alguns nomes de arquivos possuírem caracteres de nova linha).

Ou com o GNU ls :

ls -A | wc -l

com zsh :

f=(*(D))
echo $#f

Para remover um:

... | tail -n +2 | wc -l

Ou:

n=$(... | wc -l); echo "$(($n - 1))"

Com o perl, você pode usar o sinalizador -n ou -p :

... | perl -lpe '--$_'

Acima, a expressão --$_ é avaliada e o conteúdo da variável $_ é impresso para cada linha de entrada.

    
por 02.04.2013 / 16:21
0

Existe uma razão pela qual você recebe a resposta errada. Neste caso, espero que você queira contar as entradas de diretório e não ver o próprio diretório listado, como é representado pela única linha de ponto que é a última linha de saída do find.

Uma solução seria ocultar entradas que não devem ser contadas a partir de "wc -l", exemplo

find .  -depth -maxdepth 1 | grep -v "^\.$" | wc -l

Como grep pode contar as linhas, você pode usar isso para salvar a necessidade de lançar um executável adicional, exemplo

find . -depth -maxdepth 1 | grep -vc "^\.$"

Como o número de itens encontrados não é alterado com base no fato de você percorrer a profundidade primeiro ou não, é possível eliminar essa opção, dando a você

find . -maxdepth 1 | grep -vc "^\.$"
    
por 02.04.2013 / 17:33
0

Eu concordo com as outras respostas, o perl é um exagero para o que você parece estar procurando. Dito isso, certamente há razões legítimas para passar uma variável bash para perl. Use a variável de ambiente export e perl, seguindo estas linhas:

# i=$(find . -d -maxdepth 1 | wc -l) ; export i=$i ; perl -le 'print "Removing one from  $ENV{i} for ".($ENV{i}-=1)'; unset i 

Para uma solução numérica do shell:

# i=$(find . -d -maxdepth 1 | wc -l) ; echo i=$((i-1))
    
por 02.04.2013 / 21:02

Tags