我有一堆文件,我想使用正则表达式重命名它们。我想在 Linux 命令行中执行此操作。
我有文件
report1.txt
report2.txt
report3.txt
我怎样才能重命名这些以便它们声明
myreport1.txt
myreport2.txt
myreport3.txt
请告诉我,我在互联网上搜索过,他们有很多复杂的例子。
答案1
您可以在一行中仅使用一个简单的循环:
for ftr in report[0-9]*.txt; do mv "$ftr" "my${ftr}"; done
如果你不想使用循环,你可以尝试这个:
find . -maxdepth 1 -type f -name "report[0-9]*.txt" -printf "%f\n" | xargs -I{} mv {} my{}
请注意,与 for 循环一样,您需要将其放在文件所在的路径中。
答案2
回答评论中OP的问题:“有没有办法在不使用for循环的情况下做到这一点?”
我通常为此使用专用实用程序:mmv
mmv 'report?.txt' 'myreport#1.txt'
(还有其他几个类似的工具,例如rename
)
答案3
在zsh
shell 中,以下命令将重命名显示的三个文件:
autoload -U zmv
zmv -v -- 'report<1-3>.txt' 'my$f'
源模式应该是有效的zsh
扩展通配模式(带引号),并且此处使用的源模式仅与您提到的三个文件名匹配。
目标模式中的$f
将会替换为完整的原始文件名。还可以使用$1
、$2
等来引用源模式中任何带括号的捕获组(这里没有使用,因为不需要)。
从bash
shell(将源模式和目标模式zsh -c
作为参数传递给 shell):
zsh -c 'autoload -U zmv; zmv -v -- $1 $2' zsh 'report<1-3>.txt' 'my$f'
这个答案忽略了名称冲突的问题。
答案4
您可以使用MV:
for f in *.txt;do mv $f "my$f"; done
或者您可以使用重命名:您可能需要根据您的发行版安装它。
rename -v -n 's/report/myreport/' *.txt
重命名(选项*)'s/oldname/newname/' file1 file2 或使用 *.extension
如果你使用的是 Archlinux,如果这不起作用,请使用这个:
rename -v report myreport *.txt
对于选项,请检查 man rename