如何编写bash脚本来替换文件中的单词然后重命名文件?

时间:2011-01-13 23:59:01

标签: linux bash replace file-rename

我有一个文件夹结构,如下所示:

alt text

我需要创建一个执行4件事的bash脚本:

  1. 搜索通用目录中的所有文件,找到字符串'generic'并将其变为'something'
  2. 如上所述,但将“GENERIC”更改为“SOMETHING”
  3. 如上所述,但将“Generic”更改为“Something”
  4. 使用“something”
  5. 重命名其中包含“generic”的文件名

    现在我通过在net bean中使用搜索和替换来手动执行此过程。我不太了解bash脚本,但我确信这可以做到。我正在考虑我会运行的东西,它会以“Something”作为输入。

    我从哪里开始?我应该使用什么功能?整体指导会很棒。感谢。

    我使用的是Ubuntu 10.5桌面版。

2 个答案:

答案 0 :(得分:3)

修改

替换部分是sed脚本 - 称之为mapname

sed -i.bak \
    -e 's/generic/something/g' \
    -e 's/GENERIC/SOMETHING/g' \
    -e 's/Generic/Something/g "$@"

请注意,这也会改变评论和字符串中的单词,并且它会将“通用”更改为单词的一部分,而不仅仅是整个单词。如果您只想要单词,那么您可以在术语's/\<generic\>/something/g'周围使用结束词标记。 -i.bak创建备份。

您将其应用于:

find . -type f -exec mapname {} +

创建一个包含文件列表的命令并执行它。显然,如果您愿意,可以避免使用中间mapname shell / sed脚本(通过在sed命令中编写mapname脚本代替单词find) 。就个人而言,我更喜欢单独调试。

重命名

最好使用rename命令重命名文件 - 其中有两个变体,因此您需要阅读手册。使用以下两种之一:

find . -name '*generic*' -depth -exec rename   generic something   {} +

find . -name '*generic*' -depth -exec rename s/generic/something/g {} +

(感谢Stephen P指出我使用的是基于Perl的更强大的rename变体,具有完整的Perl正则表达式容量,以及Zack和{{ 3}}指出Perl one也可以在现实世界中找到 * 。)

注意:

  • 这会重命名目录。
  • 可能值得保留-depth,以便在目录之前重命名目录的内容;否则你可能会收到消息,因为你重命名了目录,然后无法在其中找到文件(因为find为你提供了旧名称)。
  • 更基本的rename只会将./generic/do_generic.java移至./something/do_generic.java。您需要多次运行该命令才能更改每个文件名的每个组件。

* 我使用的rename版本改编自Camel第1版的代码。

答案 1 :(得分:1)

步骤1-3可以这样做:

find .../path/to/generic -type f -print0 |
    xargs -0 perl -pi~ -e \
        's/\bgeneric\b/something/g; 
         s/\bGENERIC\b/SOMETHING/g;
         s/\bGeneric\b/Something/g;'

我不明白你在第4步中想要发生什么,所以我无法帮助你。