Como fazer o wc interpretar o padrão como uma lista de arquivos

3

Eu sei que existem outras maneiras de fazer isso, mas estou tentando fazer com que wc interprete stdin como um nome de arquivo ou lista de nomes de arquivos. Por exemplo,

ls JP*/std* | wc

funcionaria da mesma forma que

wc JP*/std*

Eu estou supondo que não é possível ajustar esse comportamento, mas estou trabalhando em um script onde isso tornaria minha vida muito mais fácil. Obrigado.

    
por TTT 26.10.2012 / 16:52

3 respostas

4

Use find em conjunto com xargs . A única razão pela qual estou recomendando find é aproveitar a opção -print0 , que separa nomes de arquivos por NULs; isso ajuda a evitar problemas com nomes de arquivos contendo espaços.

find .  -maxdepth 1 -type f -print0 | xargs -0 wc
    
por 26.10.2012 / 16:59
2

Se você quiser obter a saída de um comando e usá-lo como uma lista de arquivos de entrada para wc , provavelmente poderá fazer algo assim:

wc $(ls JP*/std*)

Isso executa ls JP*/std* e sua saída é passada como argumentos para wc .

xargs também pode ser útil para você aqui:

ls JP*/std* | xargs wc

Veja a xargs manpage para mais detalhes sobre como ela pode ser usada, pois é bem flexível.

    
por 26.10.2012 / 16:59
0

Depois de ler seu comentário

The input may be coming from a file,

Se a lista de arquivos já estiver no arquivo, você pode simplesmente pular a parte de localização e usar apenas a parte xargs .

Veja a página xargs man.

Use a opção -a de xargs para passar o nome do arquivo do arquivo, onde está a lista que xargs deve ler.

Se os nomes de arquivos dentro da lista não forem um nome de arquivo completo e apenas passar isso para wc não é suficiente porque não há diretório você pode editar o arquivo, para que o caminho completo seja incluído (você deve poder fazer que sem editá-lo manualmente, usando sed ou awk ou similar).

Ou você pode usar o mecanismo de substituição de string na opção xargs ( -I em xargs ) (note que se você usar este último método, com -I de substituição, cada linha invocará um programa diferente e que há algumas limitações no tamanho máximo - veja a página man para detalhes)

Se a sua entrada vem de um arquivo (e, portanto, você não pode usar o mecanismo fornecido pela opção -0 de xargs ), você deve prestar muita atenção se houver espaço ou outros caracteres estranhos no nome do arquivo . Se houver, você deve encontrar uma maneira de evitar algum resultado inesperado.

Por exemplo, se você tiver um arquivo chamado "meu documento.txt" e na sua lista está escrito como

my document.txt

e depois é passado como está escrito no arquivo, você teria que o que é executado é

wc my document.txt

e isso resultaria no programa wc procurando por dois arquivos, um chamado my e um chamado document.txt

Você deve ter certeza de que o que é passado é algo como

wc "my document.txt"

ou

wc my\ document.txt

(A primeira maneira pode ser mais fácil se você já estiver usando o mecanismo de substituição, a segunda se você já estiver editando seu arquivo.)

Bem, se você puder, talvez seja mais fácil editar o arquivo de entrada para que cada item seja separado por um caractere nulo e use a opção -0 de xargs .

    
por 26.10.2012 / 18:24

Tags