用单个命令给文件夹中所有文件加上前缀来重命名

120

用前缀 "Unix_" 重命名文件夹中的所有文件。

假设一个文件夹中有两个文件。

a.txt
b.pdf

然后它们都应该从一个命令重命名。

Unix_a.txt
Unix_b.pdf

1
请查看此链接 => http://www.cyberciti.biz/tips/renaming-multiple-files-at-a-shell-prompt.html - red eyes dev
请点击此处查看:http://theunixshell.blogspot.com/2013/01/bulk-renaming-of-files-in-unix.html - Vijay
快速且简单的命令:rename '' <prefix> * - user2110417
9个回答

143
如果你的文件名没有空格,并且没有子目录,你可以使用一个简单的for循环:
$ for FILENAME in *; do mv $FILENAME Unix_$FILENAME; done 
否则,使用方便的rename命令(它是一个Perl脚本)-虽然它可能在每个Unix上都不是默认可用的(例如,OS X不带有rename)。关于此命令的简短概述,请参阅debian-administration.org: 如果您的文件名包含空格,则使用find更容易,在Linux上,以下命令应该可以工作:
$ find . -type f -name '*' -printf "echo mv '%h/%f' '%h/Unix_%f\n'" | sh

在BSD系统中,遗憾的是没有-printf选项。但是GNU findutils可以安装(例如可通过brew install findutils在Mac OS X上安装)。

$ gfind . -type f -name '*' -printf "mv \"%h/%f\" \"%h/Unix_%f\"\n" | sh

@Matteo:感谢提示,已经更新我的答案,加上了一个警告,以及两个使用find的示例。 - miku
同时建议使用 for f in *; do [[ -f ${f} ]] && mv ...; done 仅捕获文件(不包括子目录、链接等)。 - twalberg
2
如果您按照规定引用变量,那么for FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; done将正确地工作,无论文件名中包含什么字符。它也会移动目录、套接字、符号链接和其他文件类型;我想这并不重要。 - Jonathan Leffler
不知何故,这在我所有的文件名前添加了一个“.”。 - nullability
截至2022年3月,debian-administration.org的链接无法访问。 - Dr Phil
@DrPhil,时光机来拯救了。 - miku

92

在包含文件的文件夹中尝试使用rename命令:

rename 's/^/Unix_/' *

rename (sed s 命令) 的参数指定将正则表达式 ^ 替换为 Unix_。字符 ^ 是一个特殊字符,表示 行首


10
“'s/^/.../'”是一个sed命令,意思是将每行开头的位置(^)替换成省略号(...)。 - mcont
@Matteo 的 's/^/.../'rename 命令 的 Perl 表达式参数。 - RoyalleBlue
1
这太棒了!我建议添加 folder/,因为如果命令意外地在另一个地方重复执行, 会有点危险。 - Systems Rebooter
2
替换前缀的示例:rename 's/^start_/run_' * - DenisKolodin
2
需要在Linux中安装rename软件包。 - kkgarg
显示剩余3条评论

48

我认为这正是你正在寻找的内容:

ls | xargs -I {} mv {} Unix_{}

是的,它简单而优雅且功能强大,也只有一行代码。 您可以在此页面上从我获得更详细的介绍:重命名文件和目录(添加前缀)


4
当心处理ls命令的输出结果——如果文件名中包含空格或其他奇怪字符,可能会导致问题。 - Jonathan Leffler
在重命名时替换特定字符是否可行?例如,如果文件名为2.0.2.CR1.zip,则应更改为2.0.2.GA.zip。 - Rishab Prasad

22

我最近遇到了同样的情况,并找到了一个更简单的内置解决方案。我在这里分享,希望能帮助其他需要解决问题的人。

在OS X Yosemite中,苹果将批量重命名功能直接集成到Finder中。详细信息可在此处找到。我也复制了下面的步骤:

重命名多个项目

  1. 选择项目,然后按住Control键单击其中一个项目。

  2. 在快捷菜单中,选择Rename Items。

  3. 在Rename Folder Items下的弹出菜单中,选择替换名称中的文本、添加名称中的文本或更改名称格式。

    • 替换文本:在“查找”字段中输入要删除的文本,然后在“替换为”字段中输入要添加的文本。

    • 添加文本:在字段中输入要添加的文本,然后选择在当前名称之前或之后添加文本。

    • 格式:选择文件的名称格式,然后选择将索引、计数器或日期放在名称之前或之后。在Custom Format字段中输入名称,然后输入要开始的数字。

  4. 单击Rename。

如果您的文件中有常见的模式,则可以使用替换文本,否则添加文本也可以完成工作。


2
非常好 - 省了我很多时间! - user3000868
Mac用户的绝佳解决方案 - kkgarg

7
您可以直接使用-i,而不是-I {}
ls | xargs -i mv {} unix_{}

这也完美地起作用。

  • ls - 列出目录中的所有文件
  • xargs - 由于 -i 选项,逐行接受所有文件
  • {} 是所有文件的占位符,如果 xargs 获取两个以上的输入参数,则必需

使用 awk:

ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh

-i is deprecated, now is just -I - Gianpaulo
它在Debian 8上帮助了我。谢谢。 - Abror Esonaliev

2

也适用于包含空格的项目,忽略目录

for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done

1

使用 rnm(您需要安装它):

rnm -ns 'Unix_/fn/' *

或者

rnm -rs '/^/Unix_/' *

P.S:我是这个工具的作者。


2
你应该检查你关于你的实用程序的所有答案,并添加免责声明说明你是它的作者。 - Mogsdad
@Mogsdad:我认为这并不是必要的信息。如果有人想找到作者,那是相当容易的事情。 - Jahid
谢谢您提供这个工具。不知何故,rename 对我无效,但 rnm 可以。 - Aloso

1

情况:

我们在/user/ssl/中有certificate.key certificate.crt

我们想将以certificate开头的任何内容重命名为certificate_OLD

我们现在位于/user

首先,您可以使用-n进行干运行:

rename -n "s/certificate/certificate_old/" ./ssl/*

它返回:

rename(./ssl/certificate.crt, ./ssl/certificate_OLD.crt) rename(./ssl/certificate.key, ./ssl/certificate_OLD.key)

您的文件将保持不变,这只是一个测试运行。

解决方案:

当您对测试运行的结果满意时,可以进行真正的运行:

rename "s/certificate/certificate_OLD/" ./ssl/*

它的意思是:

`rename "s/ SOMETHING / SOMETING_ELSE " PATH/FILES

提示:

如果您已经在路径上,则可以像这样运行它:

rename "s/certificate/certificate_OLD/" *

如果您想在以ss开头的任何子目录中执行此操作,请执行以下操作:

rename -n "s/certificat/certificate_old/" ./ss*/*

您还可以执行以下操作:

rename -n "s/certi*/certificate_old/" ./ss*/*

这将重命名以certi开头的任何内容,位于以ss开头的任何子目录中。

天空是极限。

尝试使用正则表达式,并总是首先使用-n进行测试。

小心,这甚至会重命名与之匹配的文件夹名称。最好进入该目录并在其中执行操作。使用时请自行承担风险。


-1

find -execdir rename

这个命令使用正则表达式来重命名文件和目录,只会影响到基础名称。

例如,如果你想要添加一个前缀,可以这样操作:

PATH=/usr/bin find . -depth -execdir rename 's/^/Unix_/' '{}' \;

或仅影响文件:

PATH=/usr/bin find . -type f -execdir rename 's/^/Unix_/' '{}' \;

-execdir 选项会在执行命令之前先进入目录,然后只对基本文件名执行命令。

我在这里详细解释了它:在Linux中查找多个文件并重命名它们


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接