在终端中使用 for 循环删除部分文件名

在终端中使用 for 循环删除部分文件名

在终端中使用 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


${变量%模式}

从末尾修剪最短的匹配项

${变量##模式}

从开头修剪最长的匹配项

${变量%%模式}

从末尾修剪最长的匹配项

${变量#模式}

从开头修剪最短的匹配项

希望能帮助到你。

相关内容