使用 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
如果您想用多个空格替换多个点,请删除选项)。如果新目录名已存在,则打印一条错误消息或将其移动。