查找文件并在Bash中替换它们的部分名称

问题描述:

我知道如何查找包含字符的文件,并将扩展名放在文件名后面。
例如,
find . -name "name1*" -exec mv {} {}.bak
查找文件并在Bash中替换它们的部分名称

执行该代码后,
name111 name11 kname1 name2 name3

name111.bak name11.bak kname1 name2 name3

但是,我想知道如何替换文件名的一部分。
例如,我想与
name222 name22 kname2 name2 name3

更换
name111 name11 kname1 name2 name3
在这种情况下,我找了包括1文件,并与2更换1

我的环境是OS X 10.10 Public Beta 5.
对不起我的英文不好。

+0

我编辑这个问题,因为我发现我犯了一个错误,并且一个答案已经消失。我为回答这个问题的人感到抱歉。我从此不会编辑这个问题。 – usingsystem8 2014-10-12 14:16:44

你可以做这样的事情:

find . -name "name1*" -type f -exec sh -c 'mv "{}" "$(echo "{}" | tr 1 2)"' \; 

请测试它在您备份一些文件!

找到您想要的文件,然后在其中的每个文件上执行sh。在shell脚本中,它使用mv将文件从其原始名称重命名为其名称,所有1都被转译为2 s。

以上将也许不是你想要的东西,如果你有一个名为在一个名为/something1or2/with/another/1/in/it,因为它会在目录路径替换1七大洲目录name1文件 - 但也许你不有!

+0

谢谢。有效。另外,我可以替换两个或更多个字符。 '发现。 -name“name1 *”-type f -exec sh -c'mv“{}”“$(echo”{}“| sed's/name1/name2/g')''\;' – usingsystem8 2014-10-13 00:43:57

+0

然后,喜欢了解如何仅替换最后一个扩展名。例如,我想用'name1.mp4 name2.mp4 name3.mp4 flv.mp4'替换'name1.flv name2.flv name3.flv flv.flv'。如果你执行'查找。 -name“name *”-type f -exec sh -c'mv“{}”“$(echo”{}“| sed's/flv/mp4/g')”';;,'name1.flv name2.flv name3.flv flv.flv'将是'name1.mp4 name2.mp4 name3.mp4 mp4.mp4'。 – usingsystem8 2014-10-13 00:52:55

+0

是否有任何方法可以防止替换目录路径中的'1'?我将在我的应用程序源代码中使用此代码,所以我不能确定我的应用程序的用户没有这个。 – usingsystem8 2014-10-13 01:24:11