Stworzyłem mały przenośny skrypt otoki o nazwie „xargsL” wokół „xargs”, który rozwiązuje większość problemów.
W przeciwieństwie do xargs, xargsL akceptuje jedną ścieżkę w linii. Ścieżki mogą zawierać dowolny znak oprócz (oczywiście) nowej linii lub bajtów NUL.
Cytowanie na liście plików nie jest dozwolone ani obsługiwane - nazwy plików mogą zawierać wszelkiego rodzaju białe znaki, ukośniki odwrotne, znaki wsteczne, znaki wieloznaczne powłoki i tym podobne - xargsL przetworzy je jako znaki dosłowne, bez szkody.
Jako dodatkowa funkcja bonusowa, xargsL nie uruchomi polecenia raz, jeśli nie ma danych wejściowych!
Zwróć uwagę na różnicę:
$ true | xargs echo no data
no data
$ true | xargsL echo no data # No output
Wszelkie argumenty podane xargsL zostaną przekazane do xargs.
Oto skrypt powłoki 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
Umieść skrypt w jakimś katalogu w $ PATH i nie zapomnij
$ chmod +x xargsL
skrypt tam, aby był wykonywalny.