根据 Bash 中的模式重命名目录

Renaming directories based on a pattern in Bash

我有一个 Bash 脚本,可以很好地重命名符合条件的 目录

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

当前目录如下:

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

它重命名目录并且只重命名目录看起来像

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

如何更改脚本/搜索条件以现在搜索

www.ibm.com - Directory-Subject

并将目录重命名为

Directory-Subject

您可以这样编写代码以涵盖这两种情况:

for dir in *\ -\ *; do
  [[ -d "$dir" ]] || continue   # skip if not a directory
  sub="${dir#* - }"
  if [[ ! -e "$sub" ]]; then
    mv "$dir" "$sub"
  fi
done

在 运行 脚本之前:

$ ls -1d */
user1 [files.sentfrom.com] - Directory-Subject/
www.ibm.com - Directory-Subject

之后:

$ ls -1d */
Directory-Subject/
www.ibm.com - Directory-Subject/   # didn't move because directory existed already

一个简单的答案是将 *\[*\]\ -\ * 更改为 *\ -\ *

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

更多信息,请阅读glob and wildcards