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
.