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

Ale*_*rro 5 linux bash rename sed batch-rename

任何人都可以推荐一种安全的解决方案,从给定的根目录开始,在文件和目录名称中递归地用下划线替换空格吗?例如,

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

变成:

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

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

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

$ find -depth -name '* *' -execdir rename " " "_" {} +;
Run Code Online (Sandbox Code Playgroud)

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

gni*_*urf 5

如果您没有rename可用的版本,或者您不确定自己拥有哪个版本,可以通过以下方法来实现:

find . -depth -name '* *' -execdir bash -c 'for i; do mv "$i" "${i// /_}"; done' _ {} +
Run Code Online (Sandbox Code Playgroud)


anu*_*ava 3

您可以使用:

find . -depth -name '* *' -execdir rename 's/ /_/g' {} +
Run Code Online (Sandbox Code Playgroud)