0

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

替代文字

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

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

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

我从哪里开始?我应该使用哪些功能?总体指导会很棒。谢谢。

我使用的是 Ubuntu 10.5 桌面版。

4

2 回答 2

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 {} +

这将创建一个带有文件列表的命令并执行它。显然,如果您愿意,可以避免中间的mapnameshell/sed 脚本(通过编写sed脚本来代替命令中的单词mapnamefind。就个人而言,我更喜欢单独调试。

重命名

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

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

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

(感谢Stephen P指出我正在使用更强大的基于 Perl 的变体,rename具有完整的 Perl 正则表达式能力,并感谢ZackJefromi指出 Perl 也存在于现实世界中*。)

笔记:

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

*我使用的版本rename改编自骆驼书第一版中的代码。

于 2011-01-14T00:05:59.880 回答
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 步中发生什么,所以我无法帮助您完成这部分。

于 2011-01-14T00:06:26.950 回答