我有一些以下格式的文件:
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.)
...其中filename1
、filename2
等可以包含空格和数字、字母、[
、]
、(
和)
等符号'
,但不能包含空格内的数字。并且extra1
、extra2
等可以包含任何内容。文件名中用空格括起来的数字不会重复filename1
。filename2
我想要的是删除包含它的文件的额外内容。也就是说,从filename20 15 extra100.ext
到filename20 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 会将出现的正则表达式替换foo
为bar
.这作用于*
当前目录中的所有文件。您还可以显式地将其替换为以*.ext
限制它作用于哪些文件。/( [0-9]*) .*\.ext
:匹配一个空格,后跟一串数字,[0-9]*
后跟另一个空格。将第一个空格和数字括在捕获组中( [0-9]*)
,以便稍后重复使用。然后匹配所有内容,.*
直到并包括扩展名\.ext
。因为这个正则表达式是“贪婪的”,所以它会尝试匹配尽可能多的字符。即如果extra
文件名部分有空格包围的数字,则将匹配它们。/$1.ext
将此匹配部分替换为上面的捕获组$1
,即空格和数字,后跟扩展名.ext
。