在一个目录中有多个以fgh开头的文件,例如:

fghfilea
fghfileb
fghfilec

我想将它们全部重命名为以前缀jkl开头。是否有一个单独的命令来执行该操作,而不是逐个重命名每个文件?


当前回答

通用命令为

找到/路径/ /文件- name ' <搜索> *’- bash - c”mv $ 0 ${0 / <搜索> / <取代>}“{}\;

其中<search>和<replace>应分别替换为您的源和目标。

作为针对您的问题定制的更具体的示例(应该从与您的文件所在的文件夹运行),上面的命令看起来像这样:

找到。- name的海湾金融公司* - bash - c ' mv $ 0 ${0 /金融/ . jkl} ' {} \;

对于“演练”,在mv之前添加echo,这样你就会看到生成了什么命令:

找到。- name的海湾金融公司* - bash - c的回声mv $ 0 ${0 /金融/ . jkl}’{}\;

其他回答

重命名海量文件的我版本:

for i in *; do
    echo "mv $i $i"
done |
sed -e "s#from_pattern#to_pattern#g” > result1.sh
sh result1.sh

这里有一个使用命令行Groovy的方法:

groovy -e 'new File(".").eachFileMatch(~/fgh.*/) {it.renameTo(it.name.replaceFirst("fgh", "jkl"))}'

在文件列表上运行sed表达式的通用脚本(将sed解决方案与重命名解决方案结合在一起):

#!/bin/sh

e=$1
shift

for f in $*; do
    fNew=$(echo "$f" | sed "$e")
    mv "$f" "$fNew";
done

通过向脚本传递一个sed表达式来调用,然后是任何文件列表,就像rename的一个版本:

script.sh 's/^fgh/jkl/' fgh*

我编写了这个脚本来搜索所有.mkv文件,递归地将找到的文件重命名为.avi。您可以根据自己的需要定制它。我还添加了一些其他的东西,比如从文件路径中获取文件目录,扩展名,文件名,以防你将来需要引用一些东西。

find . -type f -name "*.mkv" | while read fp; do 
fd=$(dirname "${fp}");
fn=$(basename "${fp}");
ext="${fn##*.}";
f="${fn%.*}";
new_fp="${fd}/${f}.avi"
mv -v "$fp" "$new_fp" 
done;

使用mmv:

mmv "fgh*" "jkl#1"