como limitar a saída do comando find usada com a opção -print0

5

Gostaria de limitar a saída do comando find. No passado eu costumava usar para este comando ls, por exemplo:

ls *tgz|head -100|xargs -i mv "{}" ../

mas fiquei sabendo que o resultado pode ser imprevisível se o nome do arquivo contiver um novo caractere de linha. Então, uma maneira mais correta de fazer isso é algo assim:

find ... -print0 | xargs -0

Mas, com essa abordagem, não consigo limitar a saída de find com o comando head - ele mostra todos os nomes de arquivos separados por ^ @ sinal especial:

 find . -name '*tgz' -print0|head -2|less

file1.tgz^@file2.tgz^@file3.tgz^@file4.tgz^@file5.tgz^@

Existe um método para eliminar esse constrangimento?

Eu tentei resolver isso com a ajuda do awk:

find . -name 'BATCHED*' -print0|awk 'BEGIN{RS=""}'

mas ainda exibe todas as linhas ou zero.

Pode ser resolvido com ajuda do awk? Existe uma solução melhor?

BTW. Eu encontrei esta referência muito instrutiva, mas não há resposta sobre a minha pergunta .

    
por szamasz 05.03.2012 / 17:00

3 respostas

3

Outra oportunidade para seguro find :

while IFS= read -r -d '' -u 9
do
    let ++count
    if [[ count -gt 10 ]]
    then
        unset count
        break
    fi
    printf "$REPLY"
    printf "$\x00"
done 9< <( find /full/path -print0 )

Para verificar, basta inseri-lo nisso:

while IFS= read -r -d ''
do
    echo "START${REPLY}END"
done
    
por 05.03.2012 / 17:38
2

O problema decorre de xargs sendo orientado por palavras, enquanto comandos como head e tail são orientados à linha. Uma solução poderia ser não usar xargs , mas GNU paralelo .

    
por 05.03.2012 / 19:37
0

Acredito que você esteja procurando o argumento --max-args ou --max-lines para xargs, dependendo do formato de entrada:

# Run less on no more than two files at a time
find . -type f -print0 | xargs --null --max-args=2 less
    
por 23.04.2012 / 18:05

Tags