A especificação POSIX oferece um exemplo disso:
ls | sed -e 's/"/"\""/g' -e 's/.*/"&"/' | xargs -E '' printf '<%s>\n'
(com nomes de arquivos sendo seqüências arbitrárias de bytes (diferente de /
e NULL) e sed
/ xargs
esperando texto , você também precisaria para corrigir o código de idioma para C (onde todos os bytes não-NUL criariam caracteres válidos) para torná-lo confiável (exceto para xargs
implementações que têm um limite muito baixo no comprimento máximo de um argumento))
O -E ''
é necessário para algumas implementações xargs
que, sem ele, entenderiam um argumento _
para significar o final da entrada (em que echo a _ b | xargs
produz a
apenas, por exemplo).
Com o GNU xargs
, você pode usar:
ls | xargs -d '\n' printf '<%s>\n'
O GNU xargs
também tem um -0
que foi copiado por algumas outras implementações, portanto:
ls | tr '\n' 'a
b
' | xargs -0 printf '<%s>\n'
é um pouco mais portátil.
Todos eles assumem que os nomes dos arquivos não contêm caracteres de nova linha. Se houver nomes de arquivos com caracteres de nova linha, a saída de ls
simplesmente não será pós-processável. Se você receber:
eval "files=($(ls --quoting-style=shell-always))"
[ "${#files[#]}" -eq 0 ] || printf '%sls | sed -e 's/"/"\""/g' -e 's/.*/"&"/' | xargs -E '' printf '<%s>\n'
' "${files[@]}" |
xargs -0 printf '<%s>\n'
Podem ser dois arquivos a
e b
ou um arquivo chamado a<newline>b
, não há como saber.
O GNU ls
tem um --quoting-style=shell-always
que torna sua saída não ambígua e poderia ser pós-processável, mas a citação não é compatível com a citação esperada por xargs
. xargs
reconhecer "..."
, \x
e '...'
formas de cotação. Mas tanto "..."
como '...'
são aspas strongs e não podem conter caracteres de nova linha (somente \
pode escapar de caracteres de nova linha para xargs
), portanto isso não é compatível com aspas onde apenas '...'
são aspas strongs ( e pode conter caracteres de nova linha), mas \<newline>
é uma continuação de linha (é removida) em vez de uma nova linha de escape.
Você pode usar o shell para analisar essa saída e, em seguida, enviá-la em um formato esperado por xargs
:
ls | xargs -d '\n' printf '<%s>\n'