Nenhum erro de arquivo ou diretório ao usar xargs

3

Eu tenho alguns arquivos com extensão .mkv e quero calcular o tamanho total deles usando du -h . Alguns dos arquivos são precedidos por whitespace caracteres.

ranveer@ranveer:~$ ls *.mkv
Arrow.S01E02.720p.HDTV.X264-DIMENSION_(1)  [SHYAMPAREEK.IN].mkv
mymediafirefreefreak.com_The.Mentalist.S05E04.480p.HDTV.X264-mRS.mkv
SHYAMPAREEK.IN-The.Vampire.Diaries.S04E02.720p.HDTV.X264-DIMENSION_(1).mkv
Supernatural.S08E03.720p.HDTV.X264-DIMENSION_(1)SHYAMPAREEK.IN].mkv
  [WWW.SHYAMPAREEK.IN].Arrow S01E01 480p HDTV.mkv
 [WWW.SHYAMPAREEK.IN].Castle.2009.S05E03.480p.HDTV.x264-mSD.mkv
ranveer@ranveer:~$ 

Agora, estou usando xargs para aplicar du -h a cada um dos arquivos, mas para os arquivos que são precedidos por whitespace caracteres, estou recebendo No such file or directory error.

ranveer@ranveer:~$ ls *.mkv | xargs -I f du -h "f" | awk '{print $1}'
du: cannot access '[WWW.SHYAMPAREEK.IN].Arrow S01E01 480p HDTV.mkv': No such file or directory
du: cannot access '[WWW.SHYAMPAREEK.IN].Castle.2009.S05E03.480p.HDTV.x264-mSD.mkv': No such file or directory
186M
151M
185M
186M
ranveer@ranveer:~$ 

Mas quando eu aplico du -h a esses arquivos individualmente, tudo funciona bem.

ranveer@ranveer:~$ du -h "  [WWW.SHYAMPAREEK.IN].Arrow S01E01 480p HDTV.mkv"
151M      [WWW.SHYAMPAREEK.IN].Arrow S01E01 480p HDTV.mkv
ranveer@ranveer:~$ 

Então, por que estou recebendo erro ao usar a combinação de xargs & du -h .

    
por RanRag 24.10.2012 / 12:43

4 respostas

3

Você não precisa de xargs neste caso: du -h -- *.mkv | awk '{print $1}'

De qualquer forma, para corrigir o problema ls *.mkv | xargs du -h | awk '{print $1}'

Funciona para mim, bash4.2

    
por 24.10.2012 / 12:47
4

Usar xargs pode ser confuso às vezes. Se você quiser usá-lo de forma confiável, você deve fazer com que sua entrada seja xargs -separated, i. e.

ls | tr \n \0 | xargs -0 stat

para alterar as novas linhas para %code% s ou fazer (se você tiver um% recente%code%)

ls | xargs -d \n stat
    
por 24.10.2012 / 13:40
2

Seu comando é um pouco Rube Goldberg-esque. Pegue a lista de arquivos *.mkv . Liste esses arquivos (potencialmente substituindo alguns caracteres não imprimíveis por uma representação aproximada). Analise a lista (com algumas regras de análise que não correspondem exatamente ao modo como a lista é gerada). Passe os elementos analisados individuais para o comando du (que seria capaz de receber vários argumentos).

O comando ls não expande curingas, é o shell que o faz. Não analise a saída de ls , ela praticamente nunca é necessária e geralmente quebra alguma coisa.

O formato de entrada do comando xargs não corresponde ao que qualquer outro comando produz. Sim, é bizarro. Com -I , xargs ignora o recuo, e é por isso que os nomes de arquivos com espaços iniciais são desconfigurados. Não use xargs , exceto com a opção -0 , ou quando você souber que sua entrada não contém caracteres que possam confundi-la.

Basta escrever

du -h *.mkv | awk '{print $1}'
    
por 24.10.2012 / 23:10
-1

Tente adicionar \ antes de seu ls , por exemplo: \ls | xargs file .

    
por 29.11.2012 / 10:42

Tags