如何在一组文件上迭代命令?

如何在一组文件上迭代命令?

我有一个充满文件的文件夹,其.dot扩展名如下:

a.dot
b.dot
c.dot

我想浏览此文件夹中的所有文件并对它们运行命令,如下所示:

dot -Tpdf a.dot -o a.pdf
dot -Tpdf b.dot -o b.pdf
dot -Tpdf c.dot -o c.pdf

我猜我需要使用竖线并执行如下命令:

ls *.dot | dot -Tpdf ... -o ....pdf

但我不知道如何使管道将每个文件仅放置在中间部分。我应该使用吗xargs?此外,如何剥离延伸部分然后将其放置到第二部分上。如果我至少能指出正确的方向(使用哪个 shell 命令),它将帮助我在解决这个问题的过程中走得更远。

答案1

使用

for i in *.dat ; do dot -Tpdf "$i" -o "$(basename "$i" dot)pdf" ; done

编辑: 正确处理带有空格的文件名。

答案2

参数是另一种迭代一组文件名的方法。但是,您不具有与 for 循环相同的灵活性来在每次迭代中操作文件名:

ls *.dot | xargs -n1 -I FILE echo dot -Tpdf FILE -o FILE.pdf

将导致

dot -Tpdf a.dot -o a.dot.pdf
dot -Tpdf b.dot -o b.dot.pdf
dot -Tpdf c.dot -o c.dot.pdf

答案3

如果您是 的粉丝awksed您也可以通过以下方式实现这一目标

ls *.dot | awk '{print("dot -Tpdf "$1" -o "$1)}' | sed 's/.dot/.pdf/2' | sh

相关内容