有没有办法在终端上用一行代码重命名多个文件?

有没有办法在终端上用一行代码重命名多个文件?

我知道如何使用 for 循环等重命名多个文件,但我想知道是否有一种方法可以使用一个 mv 命令重命名两个文件,同时保持某些字符串一致?

例如,如果我有两个文件,我只想重命名其中的一部分:

txt_ID12123_R1_001_jan.txt
txt_ID12123_R2_001_jan.txt

我要做的就是重命名“txt”,但保持其他字符串组件不变:

exam_R1_001.txt
exam_R2_001.txt

有没有一行代码可以使用正则表达式来保持某些变量的一致性?保留 R1 和 R2 字符串非常重要。我尝试了以下变体:

mv txt_1D12123_R[1,2]_001_jan.txt exam_R[1,2]_001.txt

但这显然行不通。基本上,除了 R1 和 R2 之外,整个文件名都是一样的,所以我想保持这些字符串不变,并相应地重命名。我也试过 {1,2},但花括号没有任何区别。只是想知道 - 我只需要偶尔这样做,所以为两个文件编写一个循环似乎很愚蠢,写两次 mv 也没什么大不了的,但我想一定有一些捷径。

答案1

您可以使用 mmv 命令重命名文件

mmv '*txt_1D12123*' '#1exam#2'

您想在当前目录中的所有文件中将第一次出现的 abc 替换为 xyz 请注意,在上面的例子中,我将模式括在单引号中。

答案2

安装rename包裹,

sudo apt install rename

那么就很简单了(当然,如果你熟悉 perl 的话):

rename 's/.*(_R[12]_\d+).*/exam${1}.txt/' txt*.txt

答案3

要使用正则表达式重命名文件,您需要rename工具。

安装重命名工具

sudo apt install rename

然后运行以下命令重命名所有具有.txt指定模式扩展名的文件,即 exam_R1_R2.txt

rename 's/(\S)*_R(\d{1})_(\d+)_(\w{3})\.txt/exam_R$2_$3\.txt/' *.txt

单引号中的第一个参数是正则表达式模式,它匹配并替换具有 R1 和 R2 的匹配组的文件名,第二个参数*.txt表示具有.txt扩展名的文件

了解有关正则表达式的更多信息这里你可以尝试正则表达式测试这里

相关内容