如何缩短字符串

k4h*_*k4h 4 bash rename find xargs

假设我有以下文件:1.html,2.html3.html,我想将它们重命名为1.html-bak,2.html-bak3.html-bak.为此,我运行以下命令:

find . -name '*.html' -print0 | xargs -0 -I {} mv {} {}-bak
Run Code Online (Sandbox Code Playgroud)

一切正常,文件按预期重命名.

问题是如何将它们重命名*.html*.html-bak

如何从字符串中删除最后4个字符?

fed*_*qui 7

您可以使用它${file%-*}来获取所需的文件名.以下代码循环遍历名称结尾的所有文件,html-bak并通过删除最后一个破折号后的所有内容来执行重命名:

for file in *html-bak
do
   echo "mv $file ${file%-*}" # <-- using "echo" for safety. Remove once checked
done
Run Code Online (Sandbox Code Playgroud)

${var%-*}条的最短匹配*的从后面$var.也就是说,删除直到-从右边开始找到第一个破折号:

$ file="1.h-tml-bak"
$ echo ${file%-*}
1.h-tml
Run Code Online (Sandbox Code Playgroud)

您当然也可以使用长度来获取除最后4个字符之外的所有内容:

$ echo ${file:0:-4}
1.h-tml
Run Code Online (Sandbox Code Playgroud)

  • 我不认为`0`是必要的(`"$ {file :: - 4}"`对我有用).在较旧的bash上,不支持负长度,但你可以执行``$ {file :: {#file} -4}"`. (2认同)