根据模式重命名目录

根据模式重命名目录

我想全部重命名目录在同一目录中,如果目录与某个模式匹配,则要查找的模式为user1 [files.sentfrom.com] - 示例:目录名称为:

user1 [files.sentfrom.com] - Directory-Subject

这是目录之前的图像。 之前的图像

我想将目录名称重命名为:

Directory-Subject (this could have different type of text)

这是重命名目录的后图像,注意它没有重命名目录中的任何其他文件夹或文件。 这是重命名后的图像,注意它不会重命名目录中的其他任何内容

这可以在正则表达式中一次性完成吗?或者我需要一个 for 循环吗?我也愿意接受另一种方式。

谢谢

答案1

for name in *\[*\]\ -\ *; do
  if [[ -d "$name" ]] && [[ ! -e "${name#* - }" ]]; then
    mv "$name" "${name#* - }"
  fi
done

上面的循环可以工作,bash或者ksh93至少可以遍历当前目录中与文件名通配模式匹配的所有名称*\[*\]\ -\ *(括号和空格需要从 shell 中转义),并进行测试以确保它是一个目录并且修改后的目录是可用的。名称尚不存在。如果一切正常,则会重命名该目录。

参数扩展${name#* - }将获取变量的值name,并删除从变量开头到第一次出现␣-␣(空格-破折号-空格)的所有内容。

答案2

您可以rename为此使用:

rename 's/.* ([^ ]*)$/$1/' *

它将删除目录中每个文件名中的每个字符,直到最后一个空格。

答案3

find and rename 是一个强大的团队。使用该-0选项,所有可能的文件名都会被干净地处理:

find -maxdepth 1 -type d -print0 | xargs -0 rename s/.*Directory-/Directory-/

相关内容