Tôi đã tạo một tập lệnh trình bao bọc di động nhỏ có tên "xargsL" xung quanh "xargs" để giải quyết hầu hết các vấn đề.
Trái với xargs, xargsL chấp nhận một tên đường dẫn trên mỗi dòng. Tên đường dẫn có thể chứa bất kỳ ký tự nào ngoại trừ (rõ ràng) byte mới hoặc byte NUL.
Không có trích dẫn nào được cho phép hoặc hỗ trợ trong danh sách tệp - tên tệp của bạn có thể chứa tất cả các loại khoảng trắng, dấu gạch chéo ngược, backticks, ký tự đại diện shell và tương tự - xargsL sẽ xử lý chúng dưới dạng ký tự bằng chữ, không gây hại.
Là một tính năng bổ sung, xargsL sẽ không chạy lệnh một lần nếu không có đầu vào!
Lưu ý sự khác biệt:
$ true | xargs echo no data
no data
$ true | xargsL echo no data # No output
Bất kỳ đối số nào được cung cấp cho xargsL sẽ được chuyển qua xargs.
Đây là tập lệnh 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
Đặt tập lệnh vào một số thư mục trong $ PATH của bạn và đừng quên
$ chmod +x xargsL
kịch bản ở đó để làm cho nó thực thi.