我有一个文件夹结构,如下所示:
我需要创建一个执行4件事的bash脚本:
现在我通过在net bean中使用搜索和替换来手动执行此过程。我不太了解bash脚本,但我确信这可以做到。我正在考虑我会运行的东西,它会以“Something”作为输入。
我从哪里开始?我应该使用什么功能?整体指导会很棒。感谢。
我使用的是Ubuntu 10.5桌面版。
答案 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步中想要发生什么,所以我无法帮助你。