【问题标题】:substitute file names using rename使用重命名替换文件名
【发布时间】:2018-08-30 15:56:46
【问题描述】:

我想通过替换以“_”开头的所有字符后跟八个大写字母并仅保留扩展名来重命名文件名。

4585_10_148_H2A119Ub_GTCTGTCA_S51_mcdf_mdup_ngsFlt.fm
4585_10_148_H3K27me3_TCTTCACA_S51_mcdf_mdup_ngsFlt.fm
4585_27_128_Bap1_Bethyl_ACAGATTC_S61_mcdf_mdup_ngsFlt.fw
4585_32_148_1_INPUT_previous_AGAGTCAA_S72_mcdf_mdup_ngsFlt.bw

预期输出

4585_10_148_H2A119Ub.fm
4585_10_148_H3K27me3.fm
4585_27_128_Bap1_Bethyl.fm
4585_32_148_1_INPUT_previous.fm

【问题讨论】:

    标签: shell sed rename


    【解决方案1】:

    您也可以像这样使用rename(又名prenamePerl rename):

    rename --dry-run 's|_[[:upper:]]{8}.*\.|.|' *
    

    样本输出

    '4585_10_148_H2A119Ub_GTCTGTCA_S51_mcdf_mdup_ngsFlt.fm' would be renamed to '4585_10_148_H2A119Ub.fm'
    '4585_32_148_1_INPUT_previous_AGAGTCAA_S72_mcdf_mdup_ngsFlt.bw' would be renamed to '4585_32_148_1_INPUT_previous.bw'
    

    如果输出看起来不错,删除--dry-run 并再次真正运行。

    这有几个额外的好处:

    • 如果两个文件重命名为相同的东西,它将发出警告并避免任何冲突,
    • 它可以跨目录重命名,在途中创建任何必要的中间目录,
    • 您可以先进行试运行以对其进行测试,
    • 您可以使用任意复杂的 Perl 代码来指定新名称。

    在 Mac 上,使用 homebrew 安装它:

    brew install rename
    

    【讨论】:

      【解决方案2】:

      试试这个:

      for f in *; do
          target=$(echo "${f}" | sed -E 's/_[[:upper:]]{8}.*\././')
          mv "${f}" "${target}"
      done
      

      关键是sed-E 参数,因为它启用扩展的正则表达式。

      【讨论】:

      • 刚刚注意到我的终端出现复制/粘贴错误(忘记了 echosed 命令)。如果您尝试了这个并且没有任何反应,那就是原因。
      • 文件被重命名为 4585_10_148_H2A119Ub_GTCTGTCA.fm 而不是 4585_10_148_H2A119Ub.fm
      • 这对我有用:for f in $(ls); do target=$(echo "${f}" | sed -r 's/(_[[:upper:]]{8})[^.]*//') # 理智后移除回声检查输出 echo mv "${f}" "${target}" done
      • 请不要建议解析 ls,这里只需将 $(ls) 替换为 * 即可 - 详情请参阅 mywiki.wooledge.org/ParsingLs。此外,-E 是启用 ERE 的更好选择。 . 只有一些旧版本使用sed -r 而不是sed -E
      • @Sundeep - 感谢您的反馈(已纳入答案)。有趣的是,我的系统上的man sed 中没有-E,但它可以工作(也尝试使用busybox sed)。
      【解决方案3】:

      你可以试试这个。

      for i in *.fm; do mv $i $(echo $i | sed 's/_GTCTGTCA_S51_mcdf_mdup_ngsFlt//g'); done;
      for i in *.fm; do mv $i $(echo $i | sed 's/_TCTTCACA_S51_mcdf_mdup_ngsFlt//g'); done;
      

      【讨论】:

      • 我想知道我是否可以使用任何正则表达式之王。我有 n 个具有相同模式的文件。
      • 这个 for 循环适用于任意数量的$i's(files)
      猜你喜欢
      • 2014-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-31
      • 1970-01-01
      • 2016-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多