grep não produz a saída correta quando executado no comando find

0

Minha tarefa era imprimir o número de arquivos no diretório atual sem usar os comandos ls e wc .

Eu digitei as seguintes linhas no script:

#!/bin/bash
find . -maxdepth 1 -type f \( ! -iname ".*" \) > list3
grep .* -c list3 > /dev/tty

A saída é:

..:0
.6.1c.sh.swp:1
list3:22

enquanto, de acordo com o meu entendimento, deve ser apenas: 22

Por que isso não funciona?

    
por saumya 16.04.2012 / 16:48

2 respostas

3

Por que grep não está funcionando corretamente

Não funciona porque você precisa informar grep que .* é o padrão real que você está procurando.

grep '.*' -c list3

Se você não usar as aspas simples, seu shell expandirá .* para os nomes de todos os arquivos em seu diretório. Isso se chama Expansão do nome de arquivo . Por exemplo, a.txt b.txt , então grep verá:

grep a.txt b.txt -c list3

Como as citações simples impedem que a expansão aconteça, esse é o caminho para vá aqui.

Onde seu comando grep está errado:

A propósito, você está indo na direção errada com o padrão aqui. O período . em uma expressão regular corresponde a qualquer caractere, e não ao ponto literal. Consulte a página man para mais informações. Então, seu regex diz atualmente: "encontre qualquer caractere e depois uma seqüência de qualquer caractere". Bastante redundante.

Se você realmente pretende combinar:

[dot] [anything else]

... você precisa escapar do ponto:

\.*

Onde seu comando find pode ser melhorado:

Eu não sei o que você quer dizer para se livrar de

\( ! -iname ".*" \)

Seu comando find prefixará qualquer arquivo com o ponto para o diretório de trabalho atual, portanto você não removerá nada aqui. Você poderia ter acabado de executar:

find . -maxdepth 1 -type f
    
por 16.04.2012 / 17:10
1

Para resolver o problema original, contando arquivos sem ls e wc :

Sintaxe do shell puro:

files=0
for i in *; do
    [ -f "${i}" ] && files=$((files+1))
done
echo ${files}

Para adicionar arquivos ocultos à contagem, basta alterar as configurações de globbing antes do loop for .

Alternativamente: diversão com find e expansão de shell:

echo $(($(find -maxdepth 1 -type f -printf '+1')))
    
por 11.05.2012 / 18:45