Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在unix一行程序中将*.foo更改为*.bar_Linux_Unix_Shell_Command Line_Cp - Fatal编程技术网

Linux 在unix一行程序中将*.foo更改为*.bar

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”的所有文件转换为包含相同basename但后缀修改为“.bar”的文件。我可以用一个shell脚本和一个for循环来实现这一点,但我想编写一个能够实现相同目标的单行程序

目标:
输入:*.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总是一个加号。