4

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

目标:
  输入:*.foo
  输出:*.bar

这是我尝试过的:

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

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

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

4

6 回答 6

4

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

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

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

于 2011-08-19T18:30:42.700 回答
2

对于 *.foo 中的文件;做 mv $file echo $file | sed 's/\(.*\.\)foo/\1bar/'; 完毕

例子:

$ ls
1.foo  2.foo
$ for file in *.foo ; do mv $file `echo $file | sed 's/\(.*\.\)foo/\1bar/'` ; done
$ ls
1.bar  2.bar
$ 
于 2011-08-19T18:26:01.693 回答
1

for x in $(find .-name "*.foo"); 做 mv $x ${x%%foo}bar; 完毕

于 2011-08-19T18:30:37.287 回答
1
$ for f in *.foo; do echo mv $f ${f%foo}bar; done
mv a.foo a.bar
mv b.foo b.bar

准备好后取出echo

于 2011-08-19T18:31:36.147 回答
-1

如果你已经安装了mmv,你可以这样做

mmv \*.foo \#1.bar

.

于 2011-08-19T19:10:50.960 回答
-1

为什么不使用“重命名”而不是脚本或循环。

RHEL:rename foo bar .*foo

德比安:rename 's/foo/bar/' *.foo

于 2014-10-07T04:17:48.723 回答