在终端中使用 for 循环,我们可以在文件名之前或之后添加一个部分。但如果我们想删除它,我们该怎么做呢?例如,我们可以使用以下命令在所有 .txt 文件名后添加 .old
$for i in *.txt
>do
> mv $i $i.old
> done
但我的问题是,我们如何使用相同的技术删除这个 .old?
答案1
for i in *.txt; do mv $i ${i%%.txt}; done
这是一个简单的 for 循环,就像您编写的循环一样。请注意,我使用了 ; 而不是换行符,以便我可以将其输入到一行中。对您来说唯一陌生的构造是 ${i%%.txt},它仅表示 $i,%% 符号后面的任何内容都会从 $i 的末尾截断。
一个很好的建议:如果不确定会发生什么,请尝试在实际命令前添加 echo,这样你就会看到要执行的确切命令。例如:
for i in *.txt; do echo mv $i ${i%%.txt}; done
答案2
作为这web 说...你可以尝试bash 字符串操作
您可以在参数(花括号)内使用两个不同的“运算符”,它们是#和%用于从字符串的开头或结尾修剪模式的运算符。
你的情况可能是:
${variable%pattern} 从末尾修剪最短的匹配
在终端中将是:
for i in *.old
do
mv $i ${i%\.*}
done
这里有例子:
鉴于:
foo=/tmp/my.dir/filename.tar.gz
我们可以使用以下表达方式:
路径 = ${foo%/*}
获取:/tmp/my.dir (如 dirname)
文件 = ${foo##*/}
获取方式:filename.tar.gz (类似 basename)
基础 = ${文件%%.*}
获取:文件名
ext = ${文件#*.}
获取方式:tar.gz
${变量%模式}
从末尾修剪最短的匹配项
${变量##模式}
从开头修剪最长的匹配项
${变量%%模式}
从末尾修剪最长的匹配项
${变量#模式}
从开头修剪最短的匹配项
希望能帮助到你。