目录中有多个以前缀fgh
开头的文件,例如:
fghfilea
fghfileb
fghfilec
我想将它们所有重命名为以前缀 jkl
开头。是否有一种单个命令可以代替逐个重命名每个文件?
目录中有多个以前缀fgh
开头的文件,例如:
fghfilea
fghfileb
fghfilec
我想将它们所有重命名为以前缀 jkl
开头。是否有一种单个命令可以代替逐个重命名每个文件?
有几种方法,但使用 rename
可能是最简单的。
使用 rename
的一种版本(Perl 的 rename
):
rename 's/^fgh/jkl/' fgh*
rename fgh jkl fgh*
您应该查看您所使用平台的man手册,以了解上述哪种适用。
rename
,而你展示的语法是 http://unixhelp.ed.ac.uk/CGI/man-cgi?rename 的另一个。 - Hasturkunbrew install rename
安装重命名工具 :) - samsed
和mv
一起重命名的方法:for f in fgh*; do mv "$f" $(echo "$f" | sed 's/^fgh/jkl/g'); done
如下评论所述,如果文件名中含有空格,则可能需要在返回文件名的子函数周围加上引号才能将文件移动到指定位置:
for f in fgh*; do mv "$f" "$(echo $f | sed 's/^fgh/jkl/g')"; done
for f in fgh*; do mv "$f" "$(echo $f | sed 's/^fgh/jkl/g')"; done
- Dave Nelsontouch fghfilea fghfileb fghfilec fghfile\ d
。我建议您考虑一下@DaveNelson的意见。 - luissquallrename 命令可能不在所有系统中都存在。所以如果你没有它,可以使用 shell 来完成重命名操作。 下面是在 bash shell 中的一个示例:
for f in fgh*; do mv "$f" "${f/fgh/xxx}";done
sed
命令。这个比 @nik 的答案更简单。 - Halilsh
或其他常见的 shell 中并不存在。 - tripleeels
; do mv $f $f.txt; done而且不需要安装任何东西。 - Sachin Warke使用mmv:
mmv "fgh*" "jkl#1"
#1
前加上 ;
。例如:mmv ";fgh*" "#1jkl#2"
。 - Alp有很多种方法(并非所有这些方法都适用于所有unix系统):
ls | cut -c4- | xargs -I§ mv fgh§ jkl§
§可能会被任何你觉得方便的字符替换。你也可以使用find -exec
,但许多系统的行为不同,因此我通常避免使用它。
for f in fgh*; do mv "$f" "${f/fgh/jkl}";done
粗略但有效,正如人们所说
rename 's/^fgh/jkl/' fgh*
非常美观,但是BSD上没有rename,而那是我所知道的最常见的unix系统。
rename fgh jkl fgh*
ls | perl -ne 'chomp; next unless -e; $o = $_; s/fgh/jkl/; next if -e; rename $o, $_';
如果您坚持使用Perl,但是您的系统上没有rename,则可以使用此巨兽。
其中一些有点复杂,列表远未完整,但是你几乎可以在所有unix系统中找到你想要的内容。
ls
输出。 - phuclvrename fgh jkl fgh*
使用find
、xargs
和sed
:
find . -name "fgh*" -type f -print0 | xargs -0 -I {} sh -c 'mv "{}" "$(dirname "{}")/`echo $(basename "{}") | sed 's/^fgh/jkl/g'`"'
这种方法比@nik的解决方案更加复杂,但它可以递归地重命名文件。例如,结构如下:
.
├── fghdir
│ ├── fdhfilea
│ └── fghfilea
├── fghfile\ e
├── fghfilea
├── fghfileb
├── fghfilec
└── other
├── fghfile\ e
├── fghfilea
├── fghfileb
└── fghfilec
将会被转化为这样,
.
├── fghdir
│ ├── fdhfilea
│ └── jklfilea
├── jklfile\ e
├── jklfilea
├── jklfileb
├── jklfilec
└── other
├── jklfile\ e
├── jklfilea
├── jklfileb
└── jklfilec
与 xargs
一起使用的关键是要从 xargs 中调用 shell。
通用命令如下:
find /path/to/files -name '<search>*' -exec bash -c 'mv $0 ${0/<search>/<replace>}' {} \;
在上述命令中,需要将<search>
和<replace>
替换为你的源文件名和目标文件名。
对于您的问题,以下是一个更具体的示例(应当在存储文件的同一文件夹中运行):
find . -name 'gfh*' -exec bash -c 'mv $0 ${0/gfh/jkl}' {} \;
若要进行 "试运行",请在 mv
前添加echo
,以便查看生成的命令:
find . -name 'gfh*' -exec bash -c 'echo mv $0 ${0/gfh/jkl}' {} \;
以下是使用命令行Groovy实现的方法:
groovy -e 'new File(".").eachFileMatch(~/fgh.*/) {it.renameTo(it.name.replaceFirst("fgh", "jkl"))}'