我有一些格式的文件:
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 中开始。
问候,
使用 (perl) 重命名。命令如下:
rename
请注意,Linux 发行版通常附带两个s。默认值通常是更简单的版本。基于 perl 的重命名功能更强大,因为它使您可以访问正则表达式。确保您使用的是后者。(你没有提到你的发行版,但在 Arch 中,它是由 package 提供的perl-rename
。)先测试一下
创建文件(我在最后添加了一个额外的文件)。
测试命令
如果您对结果感到满意,请删除“dry-run”/test 标志
-n
并真正运行它。解释
rename 's/foo/bar/' *
: perl rename 会将出现的正则表达式替换foo
为bar
. 这作用于*
当前目录中的所有文件。您也可以明确地将其替换为*.ext
以限制它作用于哪些文件。/( [0-9]*) .*\.ext
: 匹配一个空格,然后是一串数字,[0-9]*
然后是另一个空格。将第一个空格和数字包含在捕获组( [0-9]*)
中,以供以后重用。然后匹配所有内容.*
,包括扩展名\.ext
。因为这个正则表达式是“贪婪的”,它会尝试匹配尽可能多的字符。即,如果文件名部分有被空格包围的数字extra
,它将匹配它们。/$1.ext
将此匹配部分替换为上面的捕获组$1
,即空格和数字,后跟扩展名.ext
。