首页 > 解决方案 > 在文件名的文件扩展名之后删除未知/非特定字符串

问题描述

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

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

something-unknown.js?ver=12234.... (最后一点也不知道)

我在这个线程中找到了这个(下) :

for nam in *sqlite3_done
do
    newname=${nam%_done}
    mv $nam $newname
done

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

已尝试对上述内容进行修改:

for nam in *.js*
do
    newname=${ nam .js% } // removing all after .js
    mv $nam $newname
done

我在 MacOS Yosemite 中,有 bash shell 和 sed。知道重命名和 sed,但我只看到带有特定字符串的主题,除了这些之外没有这个问题的通配符:

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

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

标签: bashmacossedterminalrename

解决方案


我认为这就是您在参数替换方面正在寻找的内容:

$ 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

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

重命名文件将类似于:

$ 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直接执行。


推荐阅读