我试图将给定目录中后缀为“.foo”的所有文件转换为包含相同基名但后缀修改为“.bar”的文件。我可以使用 shell 脚本和 for 循环来做到这一点,但我想编写一个单行程序来实现相同的目标。

客观的:
输入:*.foo
输出:*.bar

这是我尝试过的:

find . -name "*.foo" | xargs -I {} mv {} `basename {} ".foo"`.bar

这很接近但不正确。结果:
输入:*.foo
输出:*.foo.bar

关于为什么 basename 无法识别给定后缀的任何想法? ".foo"周围的引号是可有可无的,如果省略它们,结果是一样的。

最佳答案

虽然 basename 可以处理文件扩展名,但使用 shell 参数扩展功能更容易:

for file in *.foo; do mv "$file" "${file%.foo}.bar"; done

您使用 basename 的代码不起作用,因为 basename 只运行一次,然后 xargs 每次只看到 {}.bar

关于linux - 在 unix one-liner 中将 *.foo 更改为 *.bar,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7125712/

10-17 00:36