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

时间:2011-06-13 10:57:42

标签: linux unix rename

重命名文件夹中所有文件的前缀为“Unix_”,即假设一个文件夹有两个文件a.txt和b.pdf,那么它们都应该从一个命令重命名为Unix_a.txt和Unix_b.pdf

9 个答案:

答案 0 :(得分:89)

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

答案 1 :(得分:65)

尝试包含文件的文件夹中的rename命令

rename 's/^/Unix_/' *

重命名参数(sed s command)表示用 Unix _ 替换正则表达式 ^ 。插入符号(^)是一个特殊字符,表示行的开头

答案 2 :(得分:25)

我认为这正是你所寻找的:

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

是的,它简单,优雅,功能强大,而且还有同样的线索。 您可以在页面上获得更详细的介绍:Rename Files and Directories (Add Prefix)

答案 3 :(得分:9)

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

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

重命名多个项目

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

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

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

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

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

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

  4. 点击重命名。

  5. 如果您的文件中有一个共同的模式,那么您可以使用替换文本,否则添加文本也可以完成这项工作。

答案 4 :(得分:5)

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

ls | xargs -i mv {} unix_{}

这也很有效。

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

使用awk:

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

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

rnm -ns 'Unix_/fn/' *

或者

rnm -rs '/^/Unix_/' *

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

答案 7 :(得分:0)

<强>情况:

我们在certificate.key

中有certificate.crt /user/ssl/

我们要将以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/*

含义:

`重命名&#34; s / SOMETHING / SOMETING_ELSE&#34; PATH /文件

提示

如果你已经在路径上运行它:

rename "s/certificate/certificate_OLD/" *

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

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

你也可以这样做:

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

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

天空是极限。

使用正则表达式,并始终使用-n测试此内容。

观看此即将重命名的FOLDER NAMES匹配。 更好地cd进入目录并在那里进行。 使用风险。

答案 8 :(得分: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进入目录,然后仅对基本名称执行。

我已经在Find multiple files and rename them in Linux

上进行了详细解释。