Bash 递归替换名称上的许多空格

Posted

技术标签:

【中文标题】Bash 递归替换名称上的许多空格【英文标题】:Bash recursively replace many spaces on names 【发布时间】:2015-01-02 04:27:14 【问题描述】:

谁能推荐一个安全的解决方案,从给定的根目录开始,用下划线递归替换文件和目录名称中的空格?例如,

$树 . |-- 一个目录 | `-- 带有空格的文件.txt `-- b 目录 |-- 另一个带有空格的文件.txt `-- 另一个带有空格的文件.pdf

变成:

$树 . |-- 目录 | `--file_with_spaces.txt `-- b_dir |-- another_file_with_spaces.txt `-- yet_another_file_with_spaces.pdf

我已经复制了另一个用户的问题,这是主要问题,但我需要添加另一个问题:

我正在使用以下解决方案:

$ find -depth -name '* *' -execdir rename " " "_"  +;

它有效,但仅替换在项目(目录或文件)上找到的第一个空格。关于如何创建一个循环来寻找空间并在它们全部消失时停止的任何想法?

【问题讨论】:

下面的解决方案对我有用。我刚刚添加了 -depth 选项。没有它,父目录的名称会更改,并且进程会崩溃。谢谢! 【参考方案1】:

你可以使用:

find . -depth -name '* *' -execdir rename 's/ /_/g'  +

【讨论】:

是的,问题的复制/粘贴错误。谢谢! 这似乎假定 rename 的版本(Perl 脚本)与 OP 正在使用的版本(似乎是来自 util-linux-ng 包的版本不同。【参考方案2】:

如果您没有可用的rename,或者您不确定您拥有的版本,这里有一种方法可以实现:

find . -depth -name '* *' -execdir bash -c 'for i; do mv "$i" "$i// /_"; done' _  +

【讨论】:

【参考方案3】:

这是没有rename的解决方案

find -type d -name "* *" -print | awk 'print;gsub(" ","_",$0);print' | xargs -r -n2 -d "\n" mv
find         -name "* *" -print | awk 'print;gsub(" ","_",$0);print' | xargs -r -n2 -d "\n" mv

我假设您的文件名中没有 \n

【讨论】:

【参考方案4】:

您还可以更改 IFS 变量以使 for 循环使用行尾而不是空格:

IFS=$(echo -en "\n\b") ; for file in $(find . -type f) ; do mv -v $file $file// /_ ; done

https://www.cyberciti.biz/tips/handling-filenames-with-spaces-in-bash.html

【讨论】:

以上是关于Bash 递归替换名称上的许多空格的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 bash 脚本替换文件名中的空格

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

递归(许多子目录)查找pdf文件并合并为一个pdf文件(linux,bash)

递归查找具有相同名称的文件(bash4,关联数组)

Bash 重命名扩展递归

Mac 和 Linux 上的文本文件中的递归搜索和替换