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

时间:2018-06-15 09:14:23

标签: bash macos sed replace find

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

许多文件以空格/空格结尾开始存在一些问题。

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

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

示例:

/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

此外,是否可以找到最后一个空格并替换它?

1 个答案:

答案 0 :(得分:0)

如果您需要在上一个_ - 分隔字段中使用_替换所有空格,则应将awkgsub一起使用:

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

请参阅online demo

此处,BEGIN {OFS = FS}将输出字段分隔符设置为字段分隔符,即/

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