我想删除除扩展名前的点之外的所有带有空格的特殊字符。让我们以这个文件为例,因为我有很多这样的文件。
FRD - 2023.04.12 - (mj)_Text and other chars[ ].txt
字符串
所需输出:
FRD 2023 04 12 mj Text and other chars.txt
型
我已经编写了一系列的命令来实现这一点:
1.删除除扩展名外的所有圆点:
rename -v 's/\.(?!(avi|mkv|mp4|mov|wmv|jpg|jpeg|png|txt))/ /g' *
型
结果:FRD - 2023 04 12 - (mj)_Text and other chars[ ].txt
1.删除除扩展名点之外的所有其他字符:
rename -v 's/(([^a-zA-Z\d\s])|(-)|(:))(?!(avi|mkv|mp4|mov|wmv|iso|jpg|jpeg|png|txt))/ /gi' *
型
结果:FRD 2023 04 12 mj Text and other chars .txt
1.将多个空间减少为单个空间:
rename -v 's/\s{1,10}/ /g' *
型
结果:FRD 2023 04 12 mj Text and other chars .txt
1.由于扩展名之前有字符,因此请删除此空格:
rename -v 's/(\s+)(?=(\.))//g' *
型
结果:FRD 2023 04 12 mj Text and other chars.txt
现在,我将所有这些命令放在一个带有for循环的脚本中。脚本如下:
#!/bin/bash
for f in ./*; do
rename -v 's/\.(?!(avi|mkv|mp4|mov|wmv|mpg|iso|flv|jpg|jpeg|png|txt))/ /gi' *
rename -v 's/(([^a-zA-Z\d\s])|(:))(?!(avi|mkv|mp4|mov|wmv|mpg|iso|flv|jpg|jpeg|png|txt))/ /gi' *
rename -v 's/\s{1,10}/ /g' *
rename -v 's/(\s+)(?=(\.))//g' *
done
型
下面是使用脚本时的外观:
FRD 2023 04 12 Mj Text and Other Chars Txt
型
如果所有这些命令一个接一个地工作,为什么它们在脚本中不能给予相同的结果呢?问题是什么?
1条答案
按热度按时间mjqavswn1#
单独运行这些命令时,将
*
传递给每个命令,该命令将扩展到当前文件列表。在脚本中,有一个for
循环,它对所有文件执行命令,并对文件数量重复执行。这意味着如果目录中有17个文件,则每个命令将对 all 文件运行17次,这不是您想要的。只需删除
for
循环,并保持命令不变;字符串
(of当然,用实际图案替换
'...x...'
/'...y...'
)