sed替换目录名中的空格

时间:2017-12-06 11:58:03

标签: bash macos sed

我尝试将space替换为目录名称中的-,而不是macOS上的文件名称。我有以下内容:

cd ~/foo
for directory in **; do
    if [[ -d $directory ]] && [[ -w $directory ]]; then
        sed -i '' 's/  /-/g' "$directory"
    fi
done

但我收到错误in-place editing only works for regular files

如何替换目录名称中的空格?

4 个答案:

答案 0 :(得分:3)

sed用于搜索和替换文件,而用于Linux / Unix中的目录。 -i中的sed标志用于在文件上即时替换文本,该操作对目录没有意义。您可能想要在文件名上使用sed更改目录的名称,并最终使用mv重命名具有替换字符串的实际目录。

但您可以首先使用mv使用shell原生功能将-字符替换为空格。

for directory in **; do
    if [[ -d $directory ]] && [[ -w $directory ]]; then
        mv -- "$directory" "${directory// /-}"
    fi
done

答案 1 :(得分:0)

要重命名目录,必须使用命令mv

#!/bin/bash

cd foo
for directory in **; do
    if [[ -d $directory ]] && [[ -w $directory ]]; then
        newdir=`echo "$directory" |sed  's/ /-/g' `
        if [ "$directory" -ne "$newdir" ]
           mv -- "$directory" "$newdir"
        fi
    fi
done

答案 2 :(得分:-1)

directory=`echo $directory | sed 's/ /-/g'`

答案 3 :(得分:-1)

sed功能多样,但我建议您使用更专业的工具,例如rename

rename 's/ /-/g' "$directory"

此外,您很可能尝试重命名已重命名的目录(因此不再存在)。我建议你使用find选项-depth(深度优先)和-execdir(在目录中执行命令,以避免影响父目录):

find foo -depth -type d -execdir rename 's/ /-/g' {} +
相关问题