一尘不染

如何在Linux中的命令中间传递带有xargs的所有参数

linux

我想在Linux上将所有文件作为单个参数传递,但是我不能这样做。

这工作

ls | sort -n | xargs  -i pdftk  {} cat output combinewd2.pdf

每个命令都传递一个参数,但是我希望所有命令都包含一个参数。


阅读 490

收藏
2020-06-03

共1个答案

一尘不染

这是做到这一点的一种方法

pdftk $(ls | sort -n) cat output combinewd2.pdf

或使用反引号

pdftk `ls | sort -n` cat output combinewd2.pdf

正如评论中指出的那样,这不适用于包含空格的文件名。在这种情况下,您可以使用eval

eval pdftk $(while IFS= read -r file; do
    echo \"$file\"
done < <(ls | sort -n)) cat output combinewd2.pdf

假设有两个名为“ 0 foo”和“ 1 bar”的文件,那么eval的结果将是所需的命令,文件名用双引号引起来:

pdftk " 0 foo " " 1 bar " cat output combinewd2.pdf

如果文件名中可能包含换行符,请使用find命令,请参阅@joeytwiddle在@andrewdotn答案中的讨论。以下解决方案还使用sed命令转义双引号来处理带双引号的文件名:

eval pdftk $(while IFS= read -r -d '' file; do
    echo \"$file\"
done < <(find . -maxdepth 1 -type f -print0 | \
    sed 's/"/\\"/g'| sort -zn)) cat output combinewd2.pdf
2020-06-03