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
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 .
Usar xargs pode ser confuso às vezes. Se você quiser usá-lo de forma confiável, você deve fazer com que sua entrada seja -separated, i. e. xargs
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
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}'
Tente adicionar \ antes de seu ls , por exemplo: \ls | xargs file .