我有这样的目录
mkdir test
cd test
touch file{0,1}.txt otherfile{0,1}.txt stuff{0,1}.txt
我想对目录中某些类型的文件运行某些命令(例如 ls),并将 *(glob)扩展到文件名的所有可能性。
echo 'file otherfile' | tr ' ' '\n' | xargs -I % ls %*.txt
此命令不会扩展 glob,而是尝试查找文字“file*.txt”
我如何编写类似的命令来扩展 glob?(我想使用 xargs 以便命令可以并行运行)
答案1
这是老问题了,但我遇到了这个问题并找到了另一种解决方法。让 xargs 使用 -c 和您的命令执行 bash。例如:
echo 'file otherfile' | tr ' ' '\n' | xargs -I % bash -c "ls %*.txt"
这迫使全球扩张。
答案2
我能够通过使用 标志-1
来获得我想要的功能ls
。我的命令如下所示:
ls -1 {file,otherfile}*.txt | xargs -I% echo mycommand %
答案3
你所做的将不会起作用,因为 glob 在 xargs 命令运行时不会被扩展,而是在你按下 Enter 键时且在任何这些命令开始运行之前由 shell 扩展。因此,它尝试扩展的 glob 是:
%*.txt
并且由于没有与该模式匹配的文件,因此它会将其保留原样,然后当 xargs 运行时,它会将其参数替换到该字符串中。
最简单的解决方案可能只是编写一个一次性匹配您感兴趣的所有文件的模式:
ls {file,otherfile}*.txt