我想要/需要重命名一切在与给定字符串匹配的文件夹中。我的意思是:
- 文件夹/文件
- 文件内的内容
- 隐藏文件中的内容
基本上,我想重构一个 Java 项目。当然,我可以使用 Eclipse 来处理替换,但这会遗漏工作区之外的文件夹或资源。
我原本想写一个脚本来帮我完成这个任务,但这似乎有点棘手。例如,当涉及到文件夹/文件重命名时,我只想替换名称中与我的字符串匹配的部分,其余部分应保持不变。
也许有人的脚本收藏中已经有类似的东西了?
答案1
您需要分几个步骤完成此操作
- 生成包含要更改的字符串的文件列表(例如
find mydir -type f -print | xargs egrep <searchstring>
) - 对于每个文件,进行替换(例如
| while read fn; do sed 's/searchstring/replacement/g' $fn >/tmp/foo && mv /tmp/foo $fn; done
) - 现在找到要更改的目录名称(例如
find mydir -type d -print | egrep <searchstring>
) - 并改变它们(例如
| while read olddir; do newdir=echo $olddir | sed 's/searchstring/replacement/g'; mv $olddir $newdir; done
)(echo | sed newdir 赋值周围应该有反引号;我希望得到关于如何在内联代码段中包含反引号的评论) - 现在来看看文件名,因为目录名不会改变。与目录更改非常相似,只有初始名称
find
应该是-type f
这应该足以让你继续前进。
答案2
一种快速而肮脏的方法可能是:
获取符合您的模式的所有文件的列表
# find /path -name \*pattern\* > filelist
使用 shell 脚本遍历文件列表,对每一行执行所需的任何操作:
#!/bin/sh for I in `cat filelist` do # for renaming, use mv mv $I new.file.name done
答案3
例如,如果文件名是“FILE_SAMPLE”并且我想将其更改为“FILE_TOTO”,则脚本将是:
find . -type f -name 'FILE_*' | while read FILE ; do
newfile="$(echo ${FILE} |sed -e 's/\SAMPLE/TOTO/')" ;
mv "${FILE}" "${newfile}" ;
done