2016-04-11 42 views
-1

我有这样的文件:的Linux击重命名文件

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

子目录名称是unique.I想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 

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

+0

的[Linux的重命名文件目录名]可能的复制(http://stackoverflow.com/questions/36539020/linux- rename-files-as-dirname) – pfnuesel

+0

您之前已经问过完全相同的问题,您甚至收到了如何解决这个问题的答案。 https://stackoverflow.com/questions/36539020/linux-rename-files-as-dirname – pfnuesel

回答

1

您可以使用此:

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的*):

[email protected] ~/test 
$ find -type f 
./abc/123.456 
./def/a.bc 

[email protected] ~/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