Bash 批量重命名文件夹删除尾随字符

Bash 批量重命名文件夹删除尾随字符,bash,directory,rename,Bash,Directory,Rename,我有很多以“u”和6位数字结尾的目录,例如: 我想在当前文件夹中找到所有这些文件夹,并通过删除“u”和结尾的6位数字来重命名它们 到目前为止,我一直坚持这个命令: find . -type d -print |grep '.*[0-9]\{6\}$' |xargs -I {} bash -c 'for i in {}; do mv "$i" ????; done;' 我找不到最后一步该怎么做。我会试着打电话给塞德,但怎么打? 还有,如果有更好的方法,请告诉我 谢谢给你: find /path

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

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

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

find . -type d -print |grep '.*[0-9]\{6\}$' |xargs -I {} bash -c 'for i in {}; do mv "$i" ????; done;'
我找不到最后一步该怎么做。我会试着打电话给塞德,但怎么打? 还有,如果有更好的方法,请告诉我

谢谢

给你:

find /path -regex '.*_[0-9]\{6\}' -exec sh -c 'n="{}"; echo mv "{}" "${n%_*}"' \;
检查输出,如果看起来不错,则将
echo
放在那里

说明:对于每个匹配的文件,我们运行一个子shell,在其中我们将文件名分配给变量
n
,这样我们就可以使用模式替换
${n%\u*}
,它将截断最后一个
\
字符及其后的所有内容,直到文件名结束

或者,这里有一种更便携的方法也适用于较旧的系统:

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

说明:

  • sed
    命令接收要重命名的文件列表
  • 在模式中,我们捕获
    \(…\)
  • 我们将模式替换为文本
    mv“&“\1”
    ,其中
    &
    替换为匹配的模式,在本例中,替换为整个原始文件名,
    \1
    替换为我们在
    \(…\)
    中捕获的部分

  • 以下是使用shell的一种方法:

    for i in $(find . -mindepth 1 -type d -regextype posix-extended -regex '.*_[0-9]{6}'); do 
        mv "$i" "${i%_*}";
    done
    
    #/usr/bin/env bash
    集合x
    ls-d diff*>dirlist
    而IFS=''读取字段1字段2字段3字段4字段5字段6
    做
    mv-v“${field1}{field2}{field3}{field4}{field5}{field6}”\
    “${field1}{field2}{field3}{field4}{field5}”
    已完成的列表
    
    这似乎有效,谢谢。你能解释一下“${i%\*}”吗?@Napseis:当然。这是bash参数替换,它从变量中删除最短的尾部模式(
    .*
    )。第页的汇总表可能值得一看。干杯。第一个在我的壳上不起作用,但是第二个起作用。这也适用于我们的发现-regextype posix extended-regex'.*.[0-9]{6}sed-ne的/(.*)[0-9]{6\}$/mv“&“\1”/p”但我不明白那部分,你能解释一下吗?:mv“&”“\1”/pI为第一个解决方案中的
    sed
    部分和
    ${n%\u*}
    添加了解释。
    for i in $(find . -mindepth 1 -type d -regextype posix-extended -regex '.*_[0-9]{6}'); do 
        mv "$i" "${i%_*}";
    done
    
    #!/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