关于bash:在文件名上进行文件扩展名后删除未知/非特定的字符串

Removing unknown / non-specific string after file extension on file names

尝试一次删除多个文件上文件扩展名后的字符串。我不知道文件将在哪里,只是它们将驻留在我所在的子文件夹中。

需要删除最后一个字符串,即文件扩展名之后的所有内容。文件名是:

something-unknown.js?ver = 12234 ....(最后一位也是未知的)

我在此线程中发现的这个(以下):

1
2
3
4
5
for nam in *sqlite3_done
do
    newname=${nam%_done}
    mv $nam $newname
done

我知道我必须使用%从末尾删除该位,但是当我已经将其用作"对于任何文件"选择器时,如何在最后一位中使用通配符?

尝试过修改上面的内容:

1
2
3
4
5
for nam in *.js*
do
    newname=${ nam .js% } // removing all after .js
    mv $nam $newname
done

我在MacOS Yosemite中,得到了bashshell并进行了镇静处理。知道重命名和sed,但是我只看到了带有特定字符串的主题,除了以下内容,没有针对此问题的通配符:

如何在bash中使用通配符重命名文件?

https://unix.stackexchange.com/questions/227640/rename-first-part-of-multiple-files-with-mv


我认为这是您在参数替换方面要寻找的:

1
2
3
4
5
6
7
8
9
$ ls -C1
first-unknown.js?ver=111
second-unknown.js?ver=222
third-unknown.js?ver=333

$ for f in *.js\\?ver=*; do echo ${f%\\?*}; done
first-unknown.js
second-unknown.js
third-unknown.js

请注意,我们将?转义为\\?,表示要匹配文字问号,将其与匹配任何单个字符的特殊glob符号区分开。

重命名文件将类似于:

1
2
3
4
$ for f in *.js\\?ver=*; do echo"mv $f ${f%\\?*}"; done
mv first-unknown.js?ver=111 first-unknown.js
mv second-unknown.js?ver=222 second-unknown.js
mv third-unknown.js?ver=333 third-unknown.js

我个人喜欢输出命令,将其保存到文件中,验证它是否是我想要的,然后作为shell程序脚本执行该文件。

如果需要将其完全自动化,则可以删除回波并直接执行mv


1
for x in $(find . -type f -name '*.js*');do mv $x $(echo $x | sed 's/\\.js.*/.js/'); done