重命名文件,删除文件名的一部分 bash 脚本

重命名文件,删除文件名的一部分 bash 脚本

我有一些以下格式的文件:

filename1 1 extra1.ext
filename1 2.ext
filename1 3 extra2.ext
...
filename2 1.ext
filename2 100 extra3.ext
...
filename20 1.ext
filename20 15 extra100.ext
(etc.)

...其中filename1filename2等可以包含空格和数字、字母、[]()等符号',但不能包含空格内的数字。并且extra1extra2等可以包含任何内容。文件名中用空格括起来的数字不会重复filename1filename2

我想要的是删除包含它的文件的额外内容。也就是说,从filename20 15 extra100.extfilename20 15.ext

此外,我需要在目录的内容中循环它,所以我还需要区分具有额外内容的文件(然后应用重命名方法)和不具有额外内容的文件。

是否可以?我刚刚从 Windows 迁移到 Linux,并且我有一个批处理脚本,但我不知道如何在 bash 中开始。

问候,

答案1

使用 (perl) 重命名。命令如下:

rename 's/( [0-9]*) .*\.ext/$1.ext/' *

注意,Linux 发行版通常附带两个rename版本。默认值通常是更简单的版本。基于 perl 的重命名功能更加强大,因为它使您可以访问正则表达式。确保您使用的是后者。 (你没有提到你的发行版,但在 Arch 中,它是由 package 提供的perl-rename。)

先测试一下

创建文件(我在最后添加了一个额外的文件)。

$ touch 'filename1 1 extra1.ext' 'filename1 2.ext' 'filename1 3 extra2.ext' 'filename2 1.ext' 'filename2 100 extra3.ext' 'filename20 1.ext' 'filename20 15 extra100.ext' 'filename3 1 3 4 .ext'

测试命令

$ rename 's/( [0-9]*) .*\.ext/$1.ext/' * -n
filename1 1 extra1.ext -> filename1 1.ext
filename1 3 extra2.ext -> filename1 3.ext
filename20 15 extra100.ext -> filename20 15.ext
filename2 100 extra3.ext -> filename2 100.ext
filename3 1 3 4 .ext -> filename3 1.ext

如果您对结果感到满意,请删除“试运行”/测试标志-n并真正运行它。

解释

  • rename 's/foo/bar/' *: perl rename 会将出现的正则表达式替换foobar.这作用于*当前目录中的所有文件。您还可以显式地将其替换为以*.ext限制它作用于哪些文件。
  • /( [0-9]*) .*\.ext:匹配一个空格,后跟一串数字,[0-9]*后跟另一个空格。将第一个空格和数字括在捕获组中( [0-9]*),以便稍后重复使用。然后匹配所有内容,.*直到并包括扩展名\.ext。因为这个正则表达式是“贪婪的”,所以它会尝试匹配尽可能多的字符。即如果extra文件名部分有空格包围的数字,则将匹配它们。
  • /$1.ext将此匹配部分替换为上面的捕获组$1,即空格和数字,后跟扩展名.ext

相关内容