我有大约 180 个具有相同结构的文件:000-aaaaaaaa.txt
。
文件名的正则表达式:/^[0-9]{3}\-[a-zA-Z]+$/gi
(3 位数字++-
字母+ .txt
)。
我想剪切-
每个文件名中的数字部分
例如
000-hello.txt
->hello.txt
001-world.txt
->world.txt
002-ubuntu.txt
->ubuntu.txt
003-linux.txt
->linux.txt
答案1
使用重命名文件韓國:
$ mmv '???-*' '#4'
^^^ ^ ^
123 4 4
您还可以使用范围匹配来匹配数字:
$ mmv '[0-9][0-9][0-9]-*.txt' '#4.txt'
^ ^ ^ ^ ^
1 2 3 4 4
(递归重命名文件):
$ mmv ';???-*' '#1#5'
^^^^ ^ ^ ^
1234 5 1 5
;
扩展到任意数量的目录(与 相同**/
)。*
匹配任意字符零次或多次。?
匹配任意单个字符。[]
匹配字符列表或字符范围。#
对 from 模式中的第 n 个通配符的引用。
答案2
使用基于 Perl 的rename
命令:
$ rename -n 's/\d{3}-//' [0-9][0-9][0-9]-*.txt
rename(000-hello.txt, hello.txt)
rename(001-world.txt, world.txt)
rename(002-ubuntu.txt, ubuntu.txt)
rename(003-linux.txt, linux.txt)
如果文件数量足够大,使得命令超出 shell 的限制ARG_MAX
,那么你可以使用
printf '%s\0' [0-9][0-9][0-9]-*.txt | xargs -0 rename -n 's/\d{3}-//'
或者
find . -maxdepth 1 -name '[0-9][0-9][0-9]-*.txt' -exec rename -n 's/\d{3}-//' {} +
请注意,[0-9][0-9][0-9]-*.txt
由 shell 处理,并且需要是 shell glob 表达式而不是正则表达式。
-n
一旦您确认它正在做正确的事情,就将其删除。
答案3
由于我还没有看到这里提到,你可以使用代表。虽然默认情况下未安装,但它确实支持基于正则表达式的文件重命名。您可以只执行一个正则表达式模式,如下所示:
repren --rename --from "^[0-9]{3}" --to "" --dry-run .
上述示例将删除当前目录中所有文件的文件名开头的前 3 位数字(如果它们位于文件名的开头)。它执行的操作如下:试运行尽管它无需实际执行即可向您展示它会做什么 ---dry-run
一旦您确定它会按照您的意图执行,请移除该位。
repren
也支持模式文件,允许您一次性进行多次替换:
repren --rename --patterns=path/to/patternfile
模式文件如下所示:
regex_1<tab_character>replacement_1
regex_2<tab_character>replacement_2
...等等。
最后,它支持正则表达式组。考虑这个模式文件:
# This is a comment
figure ([0-9+])<tab>Figure \1
该\1
语法插入第一组的内容(bracketed)
。要在命令行上执行此操作,我认为您需要使用单引号(如果我错了,请纠正我):
repren --rename --from 'figure ([0-9+])' --to 'Figure \1' --dry-run path/to/directory_or_files_here
不过,这只是触及了它功能的表面。它还可以选择性地更改文件的内容(因此上述所有示例中都repren
需要)。--rename
免责声明:我与其没有任何关联,repren
也没有任何开发,我只是发现它是一种非常宝贵的省时工具。
答案4
过去我经常使用基于终端的文件浏览器bulkrename
中的命令来执行此ranger
操作。步骤如下:
- 导航到包含文件的目录。
- 选择所有要重命名的文件。如果要选择该目录中的所有内容,只需按
v
。 - 使用该
:bulkrename
命令,它将带您到 vim 或默认编辑器中选定的所有文件名的列表。 - 按照您的喜好在 vim 中操作文件名并保存!