如何重命名文件夹中与特定字符串匹配的所有内容

如何重命名文件夹中与特定字符串匹配的所有内容

我想要/需要重命名一切在与给定字符串匹配的文件夹中。我的意思是:

  • 文件夹/文件
  • 文件内的内容
  • 隐藏文件中的内容

基本上,我想重构一个 Java 项目。当然,我可以使用 Eclipse 来处理替换,但这会遗漏工作区之外的文件夹或资源。

我原本想写一个脚本来帮我完成这个任务,但这似乎有点棘手。例如,当涉及到文件夹/文件重命名时,我只想替换名称中与我的字符串匹配的部分,其余部分应保持不变。

也许有人的脚本收藏中已经有类似的东西了?

答案1

您需要分几个步骤完成此操作

  1. 生成包含要更改的字符串的文件列表(例如find mydir -type f -print | xargs egrep <searchstring>
  2. 对于每个文件,进行替换(例如| while read fn; do sed 's/searchstring/replacement/g' $fn >/tmp/foo && mv /tmp/foo $fn; done
  3. 现在找到要更改的目录名称(例如find mydir -type d -print | egrep <searchstring>
  4. 并改变它们(例如| while read olddir; do newdir=echo $olddir | sed 's/searchstring/replacement/g'; mv $olddir $newdir; done)(echo | sed newdir 赋值周围应该有反引号;我希望得到关于如何在内联代码段中包含反引号的评论)
  5. 现在来看看文件名,因为目录名不会改变。与目录更改非常相似,只有初始名称find应该是-type f

这应该足以让你继续前进。

答案2

一种快速而肮脏的方法可能是:

  1. 获取符合您的模式的所有文件的列表

    # find /path -name \*pattern\* > filelist
    
  2. 使用 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 

相关内容