我试图将给定目录中后缀为“.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/