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

Posted

技术标签:

【中文标题】根据 Bash 中的模式重命名目录【英文标题】:Renaming directories based on a pattern in Bash 【发布时间】:2017-06-30 11:39:24 【问题描述】:

我有一个 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

【问题讨论】:

【参考方案1】:

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

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

更多信息请阅读glob和wildcards

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于根据 Bash 中的模式重命名目录的主要内容,如果未能解决你的问题,请参考以下文章

在 bash 脚本中获取祖父目录 - 为路径中的目录重命名文件

根据路径中的模式重命名文件

根据 Bash 中的模式更改目录名称

用于递归重命名文件夹的 Bash 脚本

在 Unix 中根据模式重命名多个文件

for in循环语句批量重命名的问题;bash