【问题标题】:How to rename several directories in all subfolders In Unix terminal如何在 Unix 终端中重命名所有子文件夹中的多个目录
【发布时间】:2016-01-05 00:00:39
【问题描述】:

我有一个名为“Experiment”的主目录,其中有几个子文件夹,如“time_data”,然后是几个子文件夹“bacterial_strain” “最后是“药物浓度”,写成“0,5 mM”。所以最终的路径是:

/Experiment/time_data/bacterial_strain/0,5 mM

我想将所有子目录中的所有目录从“0,5 mM”重命名为“0,7 mM”

我尝试运行几个不同的管道:

find . -type d | grep 0,5 | mv "0,5 mM/" "0,7 mM/"

grep -r "0,5 mM" "/path_to_Experiment_folder" | mv 0,5\ mM 0,7\ mM

但是终端给出了同样的错误:

mv: rename 0,5 mM to 0,7 mM: No such file or directory

请帮帮我,如何改变管道才能做到这一点?

【问题讨论】:

    标签: terminal grep pipeline batch-rename


    【解决方案1】:

    你可以试试这样的:

    find . -depth -type d -name "0,5mM*" -exec mv {} 
    Experiment/time_data/bacterial_strain/drug_concentration/0,7mM \;
    

    注意事项:

    1. 我注意到您的最后一个子文件夹名称包含一个空格0,5 mMfind 使用空格的命令并执行带有空格的-exec mv 对我不起作用。我不确定为什么。出于测试目的,我删除了空格字符并且上面的命令有效,它也是一个类似的命令,我只是为了可见性而分开,我相信这会被弄清楚,但是;)。
    2. 我已使用整个路径重命名最后一个文件0,5mM。我想你所有的目录深度都是一样的,如果不是,那么你可以进一步探索-depth 选项。
    3. 如果你有不同深度的目录或者不同的名字要重命名,也可以将上面的命令封装在一个脚本中,在父目录上运行。

    我希望这对你有用。

    【讨论】:

      【解决方案2】:

      这应该可行:

      $ find . -type d -name 0,5\ mM -print | while read dir ; do mv -v "${dir}" "${dir/0,5/0,7}" ; done
      

      【讨论】:

        【解决方案3】:

        另一种方式是:

        for f in Experiment/*/*/0,5\ mM; do nf=$(dirname "$f")/0,7\ mM; mv "$f" "$nf"; done
        

        或(如果您还有不想重命名的名称为“0,5 mM”的文件):

        for f in Experiment/*/*/0,5\ mM; do if [ -d "$f" ]; then nf=$(dirname "$f")/0,7\ mM; mv "$f" "$nf"; fi; done
        

        Here你可以找到其他方法来做到这一点。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-25
          • 2014-02-27
          • 2017-03-17
          • 2018-08-29
          • 2015-10-26
          • 1970-01-01
          相关资源
          最近更新 更多