【问题标题】:batch rename folder deleting trailing characters批量重命名文件夹删除尾随字符
【发布时间】:2013-12-09 00:59:38
【问题描述】:

我有很多以“_ 和 6 位数字”结尾的目录,例如:

diff_gb_and_pf_2voids_158543

我想在当前文件夹中找到所有这些文件夹,并通过删除“_”和末尾的 6 位来重命名它们。

到目前为止,我一直坚持这个命令:

find . -type d -print |grep '.*[0-9]\{6\}$' |xargs -I {} bash -c 'for i in {}; do mv "$i" ????; done;'

我找不到最后一步的方法。我会尝试调用 sed,但是如何? 另外,如果有更好的方法,请告诉。

谢谢

【问题讨论】:

    标签: bash directory rename


    【解决方案1】:

    给你:

    find /path -regex '.*_[0-9]\{6\}' -exec sh -c 'n="{}"; echo mv "{}" "${n%_*}"' \;
    

    检查输出,如果它看起来不错,则将echo 放在那里。

    解释:对于每个匹配的文件,我们运行一个子shell,我们将文件名分配给变量n,这样我们就可以使用模式替换${n%_*},它会切断最后一个_字符和所有内容在它之后直到文件名的结尾。

    或者这是一种更便携的方式,也应该适用于旧系统:

    find /path -name '*_[0-9][0-9][0-9][0-9][0-9][0-9]' | sed -ne 's/\(.*\)_[0-9]\{6\}$/mv "&" "\1"/p'
    

    检查输出,如果它看起来不错,则将其发送到sh(附加此:| sh

    解释:

    1. sed 命令接收要重命名的文件列表
    2. 在该模式中,我们在\( ... \) 中捕获文件名的第一部分
    3. 我们将模式替换为文本mv "&" "\1",其中& 替换为匹配的模式,在本例中为整个原始文件名,\1 替换为我们在\( ... \) 中捕获的部分

    【讨论】:

    • 第一个在我的 shell 上不起作用,但第二个可以。这也适用于 find 。 -regextype posix-extended -regex '.*_[0-9]{6}' | sed -ne 's/(.*)_[0-9]\{6\}$/mv "&" "\1"/p' 但我不明白那部分,你能解释一下吗?:mv "&" "\1"/p
    • 我在第一个解决方案中添加了sed 部分和${n%_*} 的解释。
    【解决方案2】:
    #!/usr/bin/env bash
    set -x
    
    ls -d diff* > dirlist
    
    while IFS='_' read field1 field2 field3 field4 field5 field6
    do
    mv -v "${field1}_${field2}_${field3}_${field4}_${field5}_${field6}" \
    "${field1}_${field2}_${field3}_${field4}_${field5}"
    done < dirlist
    

    【讨论】:

      【解决方案3】:

      这是使用 shell 的一种方法:

      for i in $(find . -mindepth 1 -type d -regextype posix-extended -regex '.*_[0-9]{6}'); do 
          mv "$i" "${i%_*}";
      done
      

      【讨论】:

      • 这似乎可行,谢谢。你能解释一下“${i%_*}”吗?
      • @Napseis:当然。这是 bash 参数替换,它从变量中删除最短的后部模式 (_*)。 this 页面上的汇总表可能值得一看。干杯。
      猜你喜欢
      • 2017-02-21
      • 1970-01-01
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      • 2018-08-22
      • 1970-01-01
      相关资源
      最近更新 更多