Linux 在unix一行程序中将*.foo更改为*.bar
我正在尝试将给定目录中后缀为“.foo”的所有文件转换为包含相同basename但后缀修改为“.bar”的文件。我可以用一个shell脚本和一个for循环来实现这一点,但我想编写一个能够实现相同目标的单行程序 目标:Linux 在unix一行程序中将*.foo更改为*.bar,linux,unix,shell,command-line,cp,Linux,Unix,Shell,Command Line,Cp,我正在尝试将给定目录中后缀为“.foo”的所有文件转换为包含相同basename但后缀修改为“.bar”的文件。我可以用一个shell脚本和一个for循环来实现这一点,但我想编写一个能够实现相同目标的单行程序 目标: 输入:*.foo 输出:*.bar 这就是我尝试过的: find . -name "*.foo" | xargs -I {} mv {} `basename {} ".foo"`.bar 这很接近,但不正确。结果: 输入:*.foo 输出:*.foo.bar 你知道为什么给定的后
输入:*.foo
输出:*.bar 这就是我尝试过的:
find . -name "*.foo" | xargs -I {} mv {} `basename {} ".foo"`.bar
这很接近,但不正确。结果:输入:*.foo
输出:*.foo.bar 你知道为什么给定的后缀不能被basename识别吗?“.foo”周围的引号是可有可无的,如果省略它们,结果是相同的 对于*.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
$
对于x,单位为美元(find.-name“*.foo”);做mv$x${x%%foo}吧;完成虽然
basename
可以处理文件扩展名,但使用shell参数扩展功能更容易:
for file in *.foo; do mv "$file" "${file%.foo}.bar"; done
使用basename
的代码不起作用,因为basename
只运行一次,而xargs每次只看到{}.bar
$ for f in *.foo; do echo mv $f ${f%foo}bar; done
mv a.foo a.bar
mv b.foo b.bar
准备好后移除回声。如果已安装
mmv
,则可以执行此操作
mmv \*.foo \#1.bar
.为什么不使用“重命名”而不是脚本或循环呢
RHEL:重命名foo-bar.*foo
Debian:
rename's/foo/bar/'*.foo
必须有一种方法可以使用find
's-exec
,对吗?在csh中,您可以使用$file:r.bar
将foo更改为bar,这样会使包含空格的文件名中断。最好锚定与$code>-exec匹配的文件,以免捕获名称中带有“foo”的文件s/\.foo$/\.bar/'这一个不会对名为foo
的文件执行任何操作;这就是OP希望我相信的。是的,你当然是对的。我没有想到。*是贪婪的。无论如何,这是我的偏好,因为它是独立于外壳的。这几天,你不会在野外看到超级老派的sh,但是如果你发现自己在Sunos4机器上,并且注意到缺少外壳参数扩展,知道sed总是一个加号。