Nome do arquivo com espaços canalizados para dois comandos xargs

1

Eu tenho um diretório e muitos subdiretórios, como o seguinte -

file with spaces.txt
filewithsuperlonglines.txt
ordinaryfile.txt
binaryfile.bin

O comando -

find . -type f -print0 | xargs -0 file | grep text | grep -v long | cut -d: -f1

produz a lista correta de arquivos (ou seja, arquivos de texto que não contêm linhas muito longas)

./file with spaces.txt
./ordinaryfile.txt

Mas quando eu adiciono outro xargs ao final do comando, recebo erros -

find . -type f -print0 | xargs -0 file | grep text | grep -v long | cut -d: -f1 | xargs -0 awk -f someprocessing.awk

gawk: someprocessing.awk:3: fatal: cannot open file './file' for reading (No such file or directory)

O conteúdo de someprocessing.awk não é relevante, pois recebo o mesmo erro se eu usar o comando cat .

Como obtenho o comando após o último canal para trabalhar com arquivos com espaços em seus nomes?

    
por bryan 19.10.2011 / 22:57

2 respostas

2

find -print0 produz saída com caracteres nulos como delimitadores. xargs -0 requer entrada com caracteres nulos como delimitadores. Seu primeiro comando xargs obtém seus caracteres nulos de find ; o segundo vê caracteres de nova linha.

Tente isto:

find . -type f -print0 | \
    xargs -0 file | \
    grep text | \
    grep -v long | \
    cut -d: -f1 | \
    tr '\n' '
find . -type f -print0 | \
    xargs -0 file | \
    grep text | \
    grep -v long | \
    cut -d: -f1 | \
    tr '\n' '%pre%' | \
    xargs -0 awk -f someprocessing.awk
' | \ xargs -0 awk -f someprocessing.awk

(Isso deve funcionar para a versão GNU Coreutils de tr ; não tenho certeza sobre outras implementações tr .)

    
por 19.10.2011 / 23:03
0

A solução aceita será estragada se o nome do arquivo contiver ':'. O seguinte somente falhará se os nomes dos arquivos contiverem ':' e evitar a manipulação \ 0:

find . -type f | parallel file | grep text | grep -v long |\
parallel --colsep ': ' awk -f someprocessing.awk {1}

Ele usa o GNU Parallel para que você obtenha o awk em paralelo gratuitamente.

Assista aos vídeos de introdução para saber mais: link

    
por 25.10.2011 / 21:48