Criei um pequeno script de invólucro portátil chamado "xargsL" em torno de "xargs", que soluciona a maioria dos problemas.
Ao contrário de xargs, xargsL aceita um nome de caminho por linha. Os nomes de caminho podem conter qualquer caractere, exceto (obviamente) nova linha ou bytes NUL.
Nenhuma citação é permitida ou suportada na lista de arquivos - seus nomes de arquivos podem conter todos os tipos de espaços em branco, barras invertidas, barras de reticulação, caracteres curinga do shell e similares - o xargsL os processará como caracteres literais, sem causar danos.
Como um recurso adicional de bônus, o xargsL não executará o comando uma vez se não houver entrada!
Observe a diferença:
$ true | xargs echo no data
no data
$ true | xargsL echo no data # No output
Quaisquer argumentos fornecidos ao xargsL serão passados para o xargs.
Aqui está o script de shell POSIX "xargsL":
#! /bin/sh
# Line-based version of "xargs" (one pathname per line which may contain any
# amount of whitespace except for newlines) with the added bonus feature that
# it will not execute the command if the input file is empty.
#
# Version 2018.76.3
#
# Copyright (c) 2018 Guenther Brunthaler. All rights reserved.
#
# This script is free software.
# Distribution is permitted under the terms of the GPLv3.
set -e
trap 'test $? = 0 || echo "$0 failed!" >& 2' 0
if IFS= read -r first
then
{
printf '%s\n' "$first"
cat
} | sed 's/./\\&/g' | xargs ${1+"$@"}
fi
Coloque o script em algum diretório no seu $ PATH e não se esqueça de
$ chmod +x xargsL
o script lá para torná-lo executável.