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 递归替换名称上的许多空格的主要内容,如果未能解决你的问题,请参考以下文章