Creé un pequeño script de contenedor portátil llamado "xargsL" alrededor de "xargs" que aborda la mayoría de los problemas.
Al contrario de xargs, xargsL acepta un nombre de ruta por línea. Los nombres de ruta pueden contener cualquier carácter excepto (obviamente) nueva línea o bytes NUL.
No se permite ni admite el uso de comillas en la lista de archivos: sus nombres de archivo pueden contener todo tipo de espacios en blanco, barras diagonales inversas, comillas invertidas, caracteres comodín de shell y similares: xargsL los procesará como caracteres literales, sin causar daño.
Como una característica adicional, ¡xargsL no ejecutará el comando una vez si no hay entrada!
Tenga en cuenta la diferencia:
$ true | xargs echo no data
no data
$ true | xargsL echo no data # No output
Cualquier argumento dado a xargsL se pasará a xargs.
Aquí está el 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
Ponga el script en algún directorio en su $ PATH y no olvide
$ chmod +x xargsL
el script allí para hacerlo ejecutable.