Ich habe ein kleines tragbares Wrapper-Skript namens "xargsL" um "xargs" erstellt, das die meisten Probleme behebt.
Im Gegensatz zu xargs akzeptiert xargsL einen Pfadnamen pro Zeile. Die Pfadnamen können beliebige Zeichen außer (offensichtlich) Zeilenumbrüchen oder NUL-Bytes enthalten.
In der Dateiliste ist kein Anführungszeichen zulässig oder wird nicht unterstützt. Ihre Dateinamen können alle Arten von Leerzeichen, Backslashes, Backticks, Shell-Platzhalterzeichen und dergleichen enthalten. XargsL verarbeitet sie als Literalzeichen, ohne dass Schaden entsteht.
Als zusätzlichen Bonus - Feature wird xargsL nicht den Befehl ausführen einmal , wenn es keine Eingabe!
Beachten Sie den Unterschied:
$ true | xargs echo no data
no data
$ true | xargsL echo no data # No output
Alle Argumente, die xargsL gegeben werden, werden an xargs weitergeleitet.
Hier ist das POSIX-Shell-Skript "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
Legen Sie das Skript in einem Verzeichnis in Ihrem $ PATH ab und vergessen Sie es nicht
$ chmod +x xargsL
das Skript dort, um es ausführbar zu machen.