Linha de comando: como manipular espaços em nomes de arquivos

1

Estou medindo o tamanho total de um monte de arquivos, cujos caminhos eu armazenei em um documento de texto, files.txt. Exemplo de conteúdo de arquivos.txt:

file1.txt
file2.txt
file3.txt

Este comando shell me dá a saída que eu quero:

$ du -hc $(cat files.txt)

a menos que eu tenha um nome de arquivo com espaços, por exemplo: file 9.txt Então, du -hc tenta analisar o nome do arquivo no espaço. Não importa onde eu pareço colocar aspas, em arquivos.txt ou no meu comando shell, ele ainda analisa incorretamente. O que devo fazer em vez disso?

FYI, meu documento de lista de arquivos é resultado de um comando assim:

find ~/Dropbox/ -type f -iname "*.BMP" >> bmpfound.txt

Detalhes do meu sistema: MacOS, usando oh-my-zsh no Terminal.app

    
por escapecharacter 18.02.2018 / 13:06

1 resposta

1

Aproveite a opção -print0 em find e canalize para xargs -0 :

find ~/Dropbox/ -type f -iname "*.BMP" -print0 | xargs -0 du -ch

Alternativamente, como Gordon Davisson comentou, isso pode ser simplificado:

find ~/Dropbox/ -type f -iname "*.BMP" -exec du -ch {} +

Qualquer um desses deve funcionar com nomes de arquivos que contenham espaços ou qualquer tipo de personagem pateta.

Não tenho certeza se você pretendia redirecionar intencionalmente a saída de find para um arquivo, em vez de direcioná-lo, mas, se realmente desejasse manter a lista de arquivos, você poderia fazer isso:

xargs -0 du -ch < bmpfound.txt
    
por 25.03.2018 / 08:12