Bash 删除文件名的文件扩展名后的未知/非特定字符串

Bash 删除文件名的文件扩展名后的未知/非特定字符串,bash,macos,sed,terminal,rename,Bash,Macos,Sed,Terminal,Rename,尝试一次删除多个文件上位于文件扩展名之后的字符串。我不知道文件将在哪里,只是它们将驻留在我所在的子文件夹中 需要删除最后一个字符串,文件扩展名之后的所有内容。文件名为: 未知的东西。js?ver=12234。。。。(最后一位也是未知的) 这一个(以下)我在: 我知道我必须使用%从末尾删除该位,但当我已经将其作为“for any file”选择器时,如何在最后一位使用通配符 已尝试使用上面的修改位: for nam in *.js* do newname=${ nam .js% } //

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

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

未知的东西。js?ver=12234。。。。(最后一位也是未知的)

这一个(以下)我在:

我知道我必须使用%从末尾删除该位,但当我已经将其作为“for any file”选择器时,如何在最后一位使用通配符

已尝试使用上面的修改位:

for nam in *.js*
do
    newname=${ nam .js% } // removing all after .js
    mv $nam $newname
done
我在约塞米蒂的MacOS,有bash shell和sed。知道rename和sed,但我只看到了带有特定字符串的主题,除以下内容外,本期没有通配符:


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

$ 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符号区分开来

然后,重命名文件将类似于:

$ 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

我始终建议在这样进行大规模重命名/移动时使用
mv-I
-n
,以避免在名称冲突的情况下丢失数据。我刚刚验证了这是有效的!它将所有文件放在一个文件夹中,并将所有过去的“.js”重命名为“.js”。所以“anythine.js?ver=12345”变成“anythine.js”。谢谢。我刚刚证实这也有效。它获取当前文件夹和所有子文件夹中的所有文件,并删除文件名中超过“.js”的所有字符串。所以“anythine here.js?ver=12345”变成了“anythine here.js”。谢谢。使用
sed
,这对我来说是最有效的一个,递归地浏览当前文件夹和子文件夹中的所有文件。因此,要解决这个问题:这是我这个解决方案的最终版本,特别是对于具有wordpress类型文件url扩展名的JS文件:
for x in$(find.-type f-name'*.JS*);do mv-v$x$(echo$x | sed's/\.js.*/.js/');完成
,这里是foo:
中的x,单位为$(find.-type f-name'*.foo*);do mv-v$x$(echo$x | sed's/\.foo.*/.foo/');完成
注意我添加的用于详细模式的
-v
for x in $(find . -type f -name '*.js*');do mv $x $(echo $x | sed 's/\.js.*/.js/'); done
for x in $(find . -type f -name '*.js*');do mv $x $(echo $x | sed 's/\.js.*/.js/'); done