递归下用文件名的下划线替换空格

Posted

技术标签:

【中文标题】递归下用文件名的下划线替换空格【英文标题】:Replace white space with underscore of the file name under recursively 【发布时间】:2018-11-25 02:45:49 【问题描述】:

我在一个文件夹和许多子文件夹下有十万个文件。

许多文件以空格开头/以空格结尾的问题。

在这种情况下,我想将这些空格 ( ) 替换为下划线 (_)。

但是,我的命令似乎改变了路径中的所有空格。

例子:

/Volumes/FolderA/Test 1/12345 Pro/12345 Pro .pdf
/Volumes/FolderA/Test 2/54321 Pro/ 54321 Pro.ai
/Volumes/FolderA/Test 3/ 33333 Pro /

更改后:(更改所有空格,包括路径)

/Volumes/FolderA/Test_1/12345_Pro/12345_Pro_.pdf
/Volumes/FolderA/Test_2/54321_Pro/_54321_Pro.ai
/Volumes/FolderA/Test_3/_33333_Pro_/

我想要什么:

/Volumes/FolderA/Test 1/12345 Pro/12345 Pro_.pdf
/Volumes/FolderA/Test 2/54321 Pro/_54321 Pro.ai
/Volumes/FolderA/Test 3/_33333 Pro_/

/Volumes/FolderA/Test 1/12345 Pro/12345_Pro_.pdf
/Volumes/FolderA/Test 2/54321 Pro/_54321_Pro.ai
/Volumes/FolderA/Test 3/_33333_Pro_/

因为我已经测试了很多代码,但没有人可以做我想做的事。 这是我的一些 Mac 终端编码:

find . -name '\ *' | while read f; do mv -v "$f" "$(sed 's/ /_/g' <<< "$f")" ; done

find . -name '*.pdf' | while read f; do mv -v "$f" "$(sed 's/ /_/g' <<< "$f")" ; done

另外,是否有可能找到最后出现的空格并替换它?

【问题讨论】:

当使用“$f// /_”时,它不会递归/更改文件路径 嗯,你需要"$(sed 's/\(.*\) /\1_/' &lt;&lt;&lt; "$f")吗? 哇,它正在处理文件;非常感谢!!但我发现它似乎不适用于以空格开头/以空格结尾的文件夹;我尝试对此进行调查。非常感谢 能否请您分享不适用于该 sed 命令的字符串? 不工作的文件夹是>> /Desktop/Test/ Test1 / /Desktop/Test/abc_123.png 我的代码和你的编码在这种情况下:find .名称'\ *' |读 f;做 mv -v "$f" "$(sed 's/(.*) /\1_/' 【参考方案1】:

如果您需要将最后一个_-delimited 字段中的所有空格替换为_,则应将awkgsub 一起使用:

awk -F"/" 'BEGIN OFS = FSgsub("[[:space:]]+","_", $NF); print' <<< "$f"

见online demo。

这里,BEGIN OFS = FS 将输出字段分隔符设置为字段分隔符,即/

gsub("[[:space:]]+","_", $NF) 行将最后一个字段 ($NF) 中的所有 1+ 空白块 ([[:space:]]+) 替换为下划线。

【讨论】:

我发现它会将文件名的所有空格更改为子文件夹/子子文件夹中的下划线,即使它不是以空格开头/结尾。 /Desktop/Folder/ABC 123.pdf -> /Desktop/Folder/ABC_123.pdf @KenSham 你试过awk -F"/" 'BEGIN OFS = FSgsub("[[:space:]]+","_", $NF); print' &lt;&lt;&lt; "$f"吗? 它只是用下划线替换所有文件的空间,但我只想用空格替换那些开始/结束。顺便说一句,谢谢你的帮助。 @KenSham 它在最后一项(在最后一个/之后)用_替换空白块,而不是在整个文件名中。

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

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

MySQL查询用下划线替换列中的空格

PHP 如何用下划线替换文件名中的空格

Python:如何在所有文件、文件夹和子文件夹的名称中用下划线替换空格?

如何替换上传文件的文件名中的空格

Linux - 替换文件名中的空格