替换文件名和目录中的空格和“-”

Replacing both spaces and " - " in filenames and directorys

我一直在读这个 this discussion 和这个 find . -depth -name '* *' \ | while IFS= read -r f ; do mv -i "$f" "$(dirname "$f")/$(basename "$f"|tr ' ' _)" ; done
帮我删除文件和目录中的空格。
Beat Boy 变为 Beat_Boy。这个可以。
我不明白的是如何处理这个问题:
Beat Boy - Best of 变成 Beat_Boy_-_Best_of 而我希望它变成 Beat_Boy-Best_of.
如果有任何提示,我将不胜感激...

此致

您可以添加 sed 以将“_-_”替换为“-”

f="Beat Boy - Best of"

echo $f | tr ' ' _ | sed 's/_-_/-/g'
#Beat_Boy-Best_of

在你的情况下,你会想要:

find . -depth -name '* *' | 
    while IFS= read -r f ; do 
        mv -i "$f" "$(dirname "$f")/$(basename "$f" |
            tr ' ' _ |
            sed 's/_-_/-/g')" ; 
    done

编辑

您也可以将 tr ' ' _ | sed 's/_-_/-/g' 替换为 sed 's/ /_/g ; s/_-_/-/g'

f="Beat Boy - Best of"
f1=${f// - /-}
f1=${f1// /_}
echo $f1

Beat_Boy-Best_of

此解决方案只是将任意数量的 [ ' ' 或 '-' ] 替换为单个 '_'。我想这可能就是您想要的。

find 命令仍然只搜索其中包含空格的文件,但您可以更改它以满足您的需要。


while IFS= read -r f ;
    mv -i "$f" "$(dirname "$f")/$(basename "$f" | sed -re 's/[ -]+/_/g')";
done < <(find . -depth -name '* *')

满分:这采用了 LC-datascientist 的解决方案并替换了 trsed 的有些笨拙的组合。甚至 Doyousketch2 关于 sed 的评论也没有使用 s///g 选项来简化它。