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

fghfilea
fghfileb
fghfilec

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


当前回答

#!/bin/sh

#replace all files ended witn .f77 to .f90 in a directory

for filename in *.f77
do 
    #echo $filename
    #b= echo $filename | cut -d. -f1
    #echo $b    
    mv "${filename}" "${filename%.f77}.f90"    
done

其他回答

在文件列表上运行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*

使用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。

有几种方法,但使用rename可能是最简单的。

使用一个版本的rename (Perl的rename):

rename 's/^fgh/jkl/' fgh*

使用另一个版本的rename(与Judy2K的答案相同):

rename fgh jkl fgh*

您应该检查您的平台的手册页,以确定上述哪一种方法适用。

rename fgh jkl fgh*

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

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