我有数百个文件,我想删除其中的开头数字。这些文件的名称类似于以下内容:
048banana.txt
049pear.txt
050watermelon.txt
051tomato.txt
062pepper.txt
053potato.txt
对于这种情况,我的建议如下:
rename 's/048|049|050|051|052|053//g' *
由于我有 100 个文件需要更改,因此写出来会非常耗费精力。是否有类似于括号扩展的方法可用于完成此操作。在理想情况下,下面的命令会很好用。
rename 's\{048..053}\\g' *
答案1
perl 中最接近的对应项可能是范围运算符 ..
例如,您可以构建一个正则表达式并按如下方式使用它:
$ rename -n 'our $re; BEGIN{$re = join "|", ("048".."053")} s/^$re//' *.txt
rename(048banana.txt, banana.txt)
rename(049pear.txt, pear.txt)
rename(050watermelon.txt, watermelon.txt)
rename(051tomato.txt, tomato.txt)
rename(053potato.txt, potato.txt)
"048"
和周围的引号"053"
是必要的,以防止前导零被强制解释为八进制序列。
或者(可能更简单),使用 shell 的括号扩展将替换的目标限制为那些特定文件,然后替换任意 3 个前导数字:
$ rename -n 's/^\d{3}//' {048..053}*.txt
rename(048banana.txt, banana.txt)
rename(049pear.txt, pear.txt)
rename(050watermelon.txt, watermelon.txt)
rename(051tomato.txt, tomato.txt)
rename(052*.txt, *.txt)
rename(053potato.txt, potato.txt)
在任何一种情况下都不需要修饰符g
,因为每个文件名只有一个替换。
请注意,shell 括号扩展将尝试重命名,052*.txt
因为您显然没有带有前缀的匹配文件名052
- 您可以shopt -s nullglob
在运行命令之前通过设置来防止这种情况。