Linux Bash重命名文件



我得到了这样的文件:

./abc/woinewi.mp3
./def/mqwoifkwe.MP3
./ghi/ioqfnw.wmv
./xxx/powijfqiwj.WMV
./yyy/qjwdweo.Mp3

子目录名称是唯一的。我想通过bash命令或scipts将它们重命名为:

./abc/abc.mp3
./def/def.MP3
./ghi/ghi.wmv
./xxx/xxx.WMV
./yyy/yyy.Mp3

或者像这样:

./abc.mp3
./def.MP3
./ghi.wmv
./xxx.WMV
./yyy.Mp3

有什么方法可以转换它们吗?谢谢

您可以使用这个:

for f in $(find -type f)
do
    bn=$(basename $f) # file name
    dn=$(dirname $f) # directory name
    newfile=${dn}/$(basename ${dn}).${bn##*.}
    echo mv ${f} ${newfile} 
done

一个衬垫:

$ for f in $(find -type f); do bn=$(basename $f); dn=$(dirname $f); echo mv $f ${dn}/$(basename ${dn}).${bn##*.}; done

如果输出是您所期望的,请删除echo

细分:

find -type f # find all files
dirname somefile # directory name from entry (/1/2/3 -> /1/2)
basename somefile # filename from entry (/1/2/3 -> 3)
${somefile##*.} # get file extension

样品(cygwin*):

reut@reut-pc ~/test
$ find -type f
./abc/123.456
./def/a.bc
reut@reut-pc ~/test
$ for f in $(find -type f); do bn=$(basename $f); dn=$(dirname $f); echo mv $f ${dn}/$(basename ${dn}).${bn##*.}; done
mv ./abc/123.456 ./abc/abc.456
mv ./def/a.bc ./def/def.bc

最新更新