【问题标题】:Find files and replace the part of the name of them in Bash在 Bash 中查找文件并替换它们的部分名称
【发布时间】:2014-12-07 04:22:41
【问题描述】:

我知道如何查找包含字符的文件并将扩展名放在文件名之后。
例如,
find . -name "name1*" -exec mv {} {}.bak

执行这段代码后,
name111 name11 kname1 name2 name3
将是
name111.bak name11.bak kname1 name2 name3

但是,我想知道如何替换文件名的一部分。
比如我想替换
name111 name11 kname1 name2 name3

name222 name22 kname2 name2 name3

在这种情况下,我查找了包含 1 的文件,并将 1 替换为 2

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

【问题讨论】:

  • 我编辑了这个问题,因为我发现我犯了一个错误,答案消失了。我很抱歉回答这个问题的人。从现在开始我永远不会编辑这个问题。

标签: macos bash replace find filenames


【解决方案1】:

你可以这样做:

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

请在您已备份的一些文件中进行测试!

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

如果您在名为/something1or2/with/another/1/in/it 的目录中有一个名为name1 的文件,则上述内容可能不会满足您的要求,因为它也会替换目录路径中的1s - 但也许您没有那个!

【讨论】:

  • 谢谢。有效。此外,我可以替换两个或更多字符。 find . -name "name1*" -type f -exec sh -c 'mv "{}" "$(echo "{}" | sed 's/name1/name2/g')"' \;
  • 那么,我想知道如何只替换最后一个扩展名。例如,我想将name1.flv name2.flv name3.flv flv.flv 替换为name1.mp4 name2.mp4 name3.mp4 flv.mp4。如果你执行find . -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
  • 有没有办法防止替换目录路径中的1s?我将在我的应用程序源代码中使用此代码,因此我无法确定我的应用程序的用户没有该代码。
  • 我只能用这个命令替换最后一个扩展名:find . -name "*flv*" -exec sh -c 'mv "{}" "$(echo "{}" | sed s/\.[^.]*$/.mp4/g )"' \; 现在,我要做的就是防止替换目录路径中的 1。
  • 我发现不需要sh -c 'something'。换句话说,find . -name "*flv*" -exec mv "{}" "$(echo "{}" | sed s/\.[^.]*$/.mp4/g )" \; 也有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
  • 2022-10-04
  • 2019-11-14
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
相关资源
最近更新 更多