在 xargs 中扩展 globs

Cra*_*aig 8 linux unix bash xargs macos

我有一个这样的目录

mkdir test
cd test
touch file{0,1}.txt otherfile{0,1}.txt stuff{0,1}.txt
Run Code Online (Sandbox Code Playgroud)

我想在目录中的某些类型的文件上运行一些命令,例如 ls ,并将 * (glob) 扩展到文件名的所有可能性。

echo 'file otherfile' | tr ' ' '\n' | xargs -I % ls %*.txt
Run Code Online (Sandbox Code Playgroud)

此命令不会扩展 glob 并尝试查找文字“file*.txt”

我如何编写一个类似的命令来扩展 globs?(我想使用 xargs 以便该命令可以并行运行)

小智 16

这是旧的,但我遇到了这个问题并找到了另一种方法来解决它。让 xargs 使用 -c 和您的命令执行 bash。例如:

echo 'file otherfile' | tr ' ' '\n' | xargs -I % bash -c "ls %*.txt"
Run Code Online (Sandbox Code Playgroud)

这迫使全球扩张。


小智 2

您所做的将不起作用,因为 glob 在运行时不会由 xargs 命令扩展,而是在您按 Enter 后以及任何这些命令开始运行之前由 shell 扩展。所以它试图扩展的 glob 是:

%*.txt
Run Code Online (Sandbox Code Playgroud)

由于没有与该模式匹配的文件,因此它不会处理该模式,然后当 xargs 运行时,它将其参数替换为该字符串。

最简单的解决方案可能只是编写一个模式来一次性匹配您感兴趣的所有文件:

ls {file,otherfile}*.txt
Run Code Online (Sandbox Code Playgroud)