在单个命令中用前缀重命名文件夹中的所有文件


Answers:


106

如果您的文件名不包含空格,并且您没有任何子目录,则可以使用一个简单的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

-printf不幸的是,在BSD系统上,没有选择。但是GNU findutils应该是可安装的(例如,在带有的Mac OS X上brew install findutils)。

$ 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 2013年

1
如果您对变量进行了引用,则for FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; done无论文件名中包含什么字符,都可以正常工作。它也可以移动目录,套接字,符号链接和其他文件类型。我想那没关系。
乔纳森·勒夫勒

不知何故,这.在我所有文件之前添加了一个
空性

75

尝试在包含文件的文件夹中rename执行命令:

rename 's/^/Unix_/' *

重命名(的参数sed的S指令)表示来替换正则表达式^Unix_。尖号(^)是一个特殊字符,表示行的开头


8
你能解释什么's/^/.../'意思吗?
mcont

@Matteo's/^/.../'重命名命令
RoyalleBlue

这太棒了!我建议添加folder / *,因为如果在其他地方意外重复执行命令,则*有点危险
Systems Rebooter

BREW安装命名@OliverPearmain
费利佩普拉萨斯

替换前缀的示例:rename 's/^start_/run_' *
DenisKolodin


15

最近,我遇到了同样的情况,发现了一个更简单的内置解决方案。我在这里分享它,以帮助其他人寻找解决方案。

借助OS X Yosemite,Apple已将批量重命名功能直接集成到Finder中。详细信息可在此处获得。我也复制了以下步骤,

重命名多个项目

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

  2. 在快捷菜单中,选择“重命名项目”。

  3. 在“重命名文件夹项目”下面的弹出菜单中,选择替换名称中的文本,向名称中添加文本,或更改名称格式。

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

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

    • 格式:选择文件的名称格式,然后选择将索引,计数器或日期放在名称之前或之后。在“自定义格式”字段中输入一个名称,然后输入您要以其开头的数字。

  4. 单击重命名。

如果文件中具有通用模式,则可以使用“替换文本”,否则“添加文本”也可以完成此工作。


太好了-节省了我很多时间!
user3000868 '16

6

您可以使用-i代替-I {}

ls | xargs -i mv {} unix_{}

这也完美地工作。

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

使用awk:

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

-i已弃用,现在只是-I
JamPow '17

它帮助我在Debian 8.Thaks
Abror Esonaliyev

2

也适用于带空格的项目,并忽略目录

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

1

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

rnm -ns 'Unix_/fn/' *

要么

rnm -rs '/^/Unix_/' *

PS:我是这个工具的作者。


2
您应该仔细阅读有关实用程序的所有答案,并添加免责声明您是该实用程序的作者。
Mogsdad

@Mogsdad:我认为这不是必要的信息。如果有人想找到作者,那很容易。
贾希德

感谢您使用此工具。出于某种原因,rename它对我rnm不起作用,但对我却有效。
阿洛索

0

情况:

我们有certificate.key certificate.crt里面/user/ssl/

我们想重命名certificatecertificate_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”路径/文件

小费:

如果您已经在路径上,请按以下方式运行它:

rename "s/certificate/certificate_OLD/" *

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

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

您也可以这样做:

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

它将重命名以开头certi的任何子目录中的任何内容ss

天空才是极限。

使用regex进行测试,并始终在使用之前进行测试-n

注意,这将重命名匹配的文件夹名称。最好cd进入目录并在此执行。自行承担风险使用。


0

find -execdir rename

这将使用仅影响基名的正则表达式重命名文件和目录。

因此,对于前缀,您可以执行以下操作:

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

或仅影响文件:

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

-execdir首先cd进入目录,然后仅对基本名称执行。

我已经在以下位置进行了详细说明:查找多个文件并在Linux中重命名它们

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.