shell 一系列Bash命令,在终端中工作,但不在脚本中工作

qmb5sa22  于 2023-08-07  发布在  Shell
关注(0)|答案(1)|浏览(83)

我想删除除扩展名前的点之外的所有带有空格的特殊字符。让我们以这个文件为例,因为我有很多这样的文件。

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


如果所有这些命令一个接一个地工作,为什么它们在脚本中不能给予相同的结果呢?问题是什么?

mjqavswn

mjqavswn1#

单独运行这些命令时,将*传递给每个命令,该命令将扩展到当前文件列表。在脚本中,有一个for循环,它对所有文件执行命令,并对文件数量重复执行。这意味着如果目录中有17个文件,则每个命令将对 all 文件运行17次,这不是您想要的。
只需删除for循环,并保持命令不变;

#!/bin/bash
rename -v '...x...' *
rename -v '...y...' *
# and so on..

字符串
(of当然,用实际图案替换'...x...'/'...y...'

相关问题