将目录和子目录名称中的所有点递归替换为空格

将目录和子目录名称中的所有点递归替换为空格

使用 bash 我试图用空格替换目录及其子目录名称中的所有点。

示例:目录目录1.3 会变成目录 1 3

到目前为止我的脚本:

#!/bin/bash    
for dir in *\ -\ *; do

      [[ -d "$dir" ]] || continue   # skip if not a directory
      sub="${dir#* - }"
      if [[ ! -e "$sub" ]]; then
        mv "$dir" "$sub"
        mv echo "$(echo "Result: ${dir%.*}" | sed 's/\./ /g').${dir##*.}"

      fi
done

答案1

使用find

find . -mindepth 1 -type d -name "*.*" -exec bash -c '
  for ((i=$#;i>0;i--)); do
    dir=${!i}
    newdir=$(dirname "$dir")/$(basename "$dir" | tr -s "." " ")
    if [ -e "$newdir" ]; then
      echo "skipping \"$dir\", \"$newdir\" already exists" >&2 
    else
      mv "$dir" "$newdir"
    fi
  done
' bash {} +

这会在当前目录中使用模式递归查找所有目录名称,*.*并使用 . 跳过当前目录-mindepth 1。找到的目录列表被传递-exec到 bash 脚本,其中其参数在 for 循环中以相反的顺序进行处理(具有更深级别的子目录首先出现)。

新目录名称是根据其dirname和来创建的basename。后者经过修改,tr其中多个点替换为一个空格字符(-s如果您想用多个空格替换多个点,请删除选项)。如果新目录名已存在,则打印一条错误消息或将其移动。

相关内容