在单个命令中使用前缀重命名文件夹中的所有文件
Posted
技术标签:
【中文标题】在单个命令中使用前缀重命名文件夹中的所有文件【英文标题】:Rename all files in a folder with a prefix in a single command 【发布时间】:2011-09-13 20:14:43 【问题描述】:重命名文件夹中的所有文件,前缀为"Unix_"
假设一个文件夹有两个文件
a.txt
b.pdf
那么它们都应该从单个命令重命名为
Unix_a.txt
Unix_b.pdf
【问题讨论】:
查看此链接 => cyberciti.biz/tips/… 查看这里:theunixshell.blogspot.com/2013/01/… 【参考方案1】:如果您的文件名包含没有空白并且您没有任何子目录,则可以使用简单的for
循环:
$ for FILENAME in *; do mv $FILENAME Unix_$FILENAME; done
否则,请使用方便的 rename
命令(这是一个 perl 脚本)——尽管它可能并非在每个 Unix 上都可用(例如,OS X 不附带 rename
)。
debian-administration.org 上的简短概述:
Easily renaming multiple files如果您的文件名包含空格,则使用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
的两个示例。
还建议for f in *; do [[ -f $f ]] && mv ...; done
仅捕获文件(无子目录、链接等)...
如果您按照应有的方式引用变量,那么for FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; done
可以正常工作,无论文件名中有什么字符。它也会移动目录、套接字、符号链接和其他文件类型;我想这没关系。
不知何故这在我所有的文件之前添加了一个.
【参考方案2】:
在包含文件的文件夹中尝试rename
命令:
rename 's/^/Unix_/' *
重命名参数(sed s command)表示将正则表达式^替换为Unix_。插入符号 (^) 是一个特殊字符,表示 行首。
【讨论】:
你能解释一下's/^/.../'
是什么意思吗?
@Matteo 's/^/.../'
是 rename command 的 perl 表达式参数
这太棒了!我建议添加 folder/* ,因为如果命令意外在另一个地方重复,* 会有点危险
brew install rename @OliverPearmain
替换前缀示例:rename 's/^start_/run_' *
【参考方案3】:
我认为这正是您想要的:
ls | xargs -I mv Unix_
是的,它简单而优雅,功能强大,而且是单行的。 您可以在页面上从我这里获得更详细的介绍:Rename Files and Directories (Add Prefix)
【讨论】:
小心处理ls
的输出——如果文件名中有空格或其他奇怪的字符会导致问题。
重命名时是否可以替换某些字符。比如文件名是2.0.2.CR1.zip,应该变成2.0.2.GA.zip【参考方案4】:
我最近遇到了同样的情况,并找到了一个更简单的内置解决方案。我在这里分享它,以便它可以帮助其他人寻找解决方案。
在 OS X Yosemite 中,Apple 已将批量重命名功能直接集成到 Finder 中。详情请见here。我也复制了以下步骤,
重命名多个项目
选择项目,然后按住 Control 键单击其中一项。
在快捷菜单中,选择重命名项目。
在重命名文件夹项目下方的弹出菜单中,选择替换名称中的文本、向名称中添加文本或更改名称格式。
替换文本:在“查找”字段中输入要删除的文本,然后在“替换为”字段中输入要添加的文本。
添加文本:在字段中输入要添加的文本,然后选择在当前名称之前或之后添加文本。
格式:选择文件的名称格式,然后选择将索引、计数器或日期放在名称之前或之后。在“自定义格式”字段中输入名称,然后输入要开始的数字。
单击重命名。
如果您的文件中有一个通用模式,则可以使用替换文本,否则添加文本也可以完成这项工作。
【讨论】:
非常好 - 为我节省了很多时间! Mac 用户的绝佳解决方案【参考方案5】:您可以只使用-i
而不是-I
ls | xargs -i mv unix_
这也很有效。
ls
- 列出目录中的所有文件
xargs
- 由于-i
选项,逐行接受所有文件
是所有文件的占位符,如果 xargs
获得两个以上的参数作为输入,则这是必需的
使用 awk:
ls -lrt | grep '^-' | awk 'print "mv "$9" unix_"$9""' | sh
【讨论】:
-i
已弃用,现在只是 -I
它在 Debian 8.Thaks 上帮助了我【参考方案6】:
也适用于带有空格的项目并忽略目录
for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done
【讨论】:
【参考方案7】:使用rnm(您需要安装它):
rnm -ns 'Unix_/fn/' *
或者
rnm -rs '/^/Unix_/' *
P.S : 我是这个工具的作者。
【讨论】:
您应该仔细阅读有关您的实用程序的所有答案,并添加您是其作者的免责声明。 @Mogsdad :我认为这不是必要的信息。如果有人想找到作者,这很容易。 感谢您提供此工具。出于某种原因,rename
不适合我,但 rnm
可以。【参考方案8】:
情况:
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/*
什么意思:
`重命名“s/SOMETHING/SOMETHING_ELSE”路径/文件
提示:
如果您已经在路径上,请像这样运行它:
rename "s/certificate/certificate_OLD/" *
或者,如果您想在以ss
开头的任何子目录中执行此操作,请执行以下操作:
rename -n "s/certificat/certificate_old/" ./ss*/*
你也可以这样做:
rename -n "s/certi*/certificate_old/" ./ss*/*
这会重命名任何以ss
开头的子目录中以certi
开头的任何内容。
天空才是极限。
使用正则表达式并始终使用-n
进行测试。
注意这甚至会重命名匹配的文件夹名称。
最好将cd
放入目录并在那里执行。
使用风险自负。
【讨论】:
【参考方案9】:find -execdir rename
这会使用仅影响基本名称的正则表达式重命名文件和目录。
所以对于前缀你可以这样做:
PATH=/usr/bin find . -depth -execdir rename 's/^/Unix_/' '' \;
或仅影响文件:
PATH=/usr/bin find . -type f -execdir rename 's/^/Unix_/' '' \;
-execdir
先将cd
s 放入目录中,然后仅对基本名称执行。
我已经在Find multiple files and rename them in Linux做了更详细的解释
【讨论】:
以上是关于在单个命令中使用前缀重命名文件夹中的所有文件的主要内容,如果未能解决你的问题,请参考以下文章