用前缀 "Unix_"
重命名文件夹中的所有文件。
假设一个文件夹中有两个文件。
a.txt
b.pdf
然后它们都应该从一个命令重命名。
Unix_a.txt
Unix_b.pdf
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
find
的示例。 - mikufor f in *; do [[ -f ${f} ]] && mv ...; done
仅捕获文件(不包括子目录、链接等)。 - twalbergfor FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; done
将正确地工作,无论文件名中包含什么字符。它也会移动目录、套接字、符号链接和其他文件类型;我想这并不重要。 - Jonathan Leffler在包含文件的文件夹中尝试使用rename
命令:
rename 's/^/Unix_/' *
rename (sed s 命令) 的参数指定将正则表达式 ^ 替换为 Unix_。字符 ^ 是一个特殊字符,表示 行首。
rename 's/^start_/run_' *
- DenisKolodinrename
软件包。 - kkgarg我认为这正是你正在寻找的内容:
ls | xargs -I {} mv {} Unix_{}
是的,它简单而优雅且功能强大,也只有一行代码。 您可以在此页面上从我获得更详细的介绍:重命名文件和目录(添加前缀)
ls
命令的输出结果——如果文件名中包含空格或其他奇怪字符,可能会导致问题。 - Jonathan Leffler我最近遇到了同样的情况,并找到了一个更简单的内置解决方案。我在这里分享,希望能帮助其他需要解决问题的人。
在OS X Yosemite中,苹果将批量重命名功能直接集成到Finder中。详细信息可在此处找到。我也复制了下面的步骤:
重命名多个项目
选择项目,然后按住Control键单击其中一个项目。
在快捷菜单中,选择Rename Items。
在Rename Folder Items下的弹出菜单中,选择替换名称中的文本、添加名称中的文本或更改名称格式。
替换文本:在“查找”字段中输入要删除的文本,然后在“替换为”字段中输入要添加的文本。
添加文本:在字段中输入要添加的文本,然后选择在当前名称之前或之后添加文本。
格式:选择文件的名称格式,然后选择将索引、计数器或日期放在名称之前或之后。在Custom Format字段中输入名称,然后输入要开始的数字。
单击Rename。
如果您的文件中有常见的模式,则可以使用替换文本,否则添加文本也可以完成工作。
-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也适用于包含空格的项目,忽略目录
for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done
rename
对我无效,但 rnm
可以。 - Aloso情况:
我们在/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
进行测试。
小心,这甚至会重命名与之匹配的文件夹名称。最好进入该目录并在其中执行操作。使用时请自行承担风险。
find -execdir rename
这个命令使用正则表达式来重命名文件和目录,只会影响到基础名称。
例如,如果你想要添加一个前缀,可以这样操作:
PATH=/usr/bin find . -depth -execdir rename 's/^/Unix_/' '{}' \;
或仅影响文件:
PATH=/usr/bin find . -type f -execdir rename 's/^/Unix_/' '{}' \;
-execdir
选项会在执行命令之前先进入目录,然后只对基本文件名执行命令。
我在这里详细解释了它:在Linux中查找多个文件并重命名它们
rename '' <prefix> *
- user2110417