递归下用文件名的下划线替换空格
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_/' <<< "$f")
吗?
哇,它正在处理文件;非常感谢!!但我发现它似乎不适用于以空格开头/以空格结尾的文件夹;我尝试对此进行调查。非常感谢
能否请您分享不适用于该 sed 命令的字符串?
不工作的文件夹是>> /Desktop/Test/ Test1 / /Desktop/Test/abc_123.png 我的代码和你的编码在这种情况下:find .名称'\ *' |读 f;做 mv -v "$f" "$(sed 's/(.*) /\1_/'
【参考方案1】:
如果您需要将最后一个_
-delimited 字段中的所有空格替换为_
,则应将awk
与gsub
一起使用:
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' <<< "$f"
吗?
它只是用下划线替换所有文件的空间,但我只想用空格替换那些开始/结束。顺便说一句,谢谢你的帮助。
@KenSham 它在最后一项(在最后一个/
之后)用_
替换空白块,而不是在整个文件名中。以上是关于递归下用文件名的下划线替换空格的主要内容,如果未能解决你的问题,请参考以下文章