Я створив невеликий сценарій портативної обгортки під назвою "xargsL" навколо "xargs", який вирішує більшість проблем.
На відміну від xargs, xargsL приймає одну назву шляху на рядок. Імена шляхів можуть містити будь-який символ, за винятком (очевидно) нового рядка або балів NUL.
У списку файлів не дозволено і не підтримується цитування - назви ваших файлів можуть містити всілякі пробіли, зворотні косої риси, задні підказки, символи символів оболонки тощо - xargsL обробить їх як буквальні символи, шкоди не буде зроблено.
Як додаткова функція бонусу, xargsL не запустить команду один раз, якщо немає вводу!
Зверніть увагу на різницю:
$ true | xargs echo no data
no data
$ true | xargsL echo no data # No output
Будь-які аргументи, надані xargsL, будуть передані до xargs.
Ось сценарій оболонки "xargsL" POSIX:
#! /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
сценарій там, щоб зробити його виконуваним.