Я создал небольшой переносимый скрипт-обертку под названием «xargsL» вокруг «xargs», который решает большинство проблем.
В отличие от xargs, xargsL принимает одно имя пути на строку. Имена путей могут содержать любой символ, кроме (очевидно) символа новой строки или байтов NUL.
В списке файлов цитирование не допускается и не поддерживается - имена файлов могут содержать все виды пробелов, обратных косых черт, обратных черт, подстановочных знаков оболочки и т. П. - xargsL будет обрабатывать их как буквенные символы, без вреда для себя.
Как дополнительная бонусная функция, xargsL не будет запускать команду один раз, если нет ввода!
Обратите внимание на разницу:
$ true | xargs echo no data
no data
$ true | xargsL echo no data # No output
Все аргументы, переданные xargsL, будут переданы xargs.
Вот сценарий оболочки 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
Поместите скрипт в какой-то каталог в вашем $ PATH и не забудьте
$ chmod +x xargsL
сценарий, чтобы сделать его исполняемым.