如何立即重命名这些文件?

如何立即重命名这些文件?

我有一堆文件,我想使用正则表达式重命名它们。我想在 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

zshshell 中,以下命令将重命名显示的三个文件:

autoload -U zmv
zmv -v -- 'report<1-3>.txt' 'my$f'

源模式应该是有效的zsh扩展通配模式(带引号),并且此处使用的源模式仅与您提到的三个文件名匹配。

目标模式中的$f将会替换为完整的原始文件名。还可以使用$1$2等来引用源模式中任何带括号的捕获组(这里没有使用,因为不需要)。

bashshell(将源模式和目标模式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

相关内容