-1

I got files like this:

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

The sub-dir name is unique.I want to rename them by bash command or scipts to this:

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

or like this:

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

Is there any way to convert them? Thanks!!!

Leesy
  • 11
  • 1
  • Possible duplicate of [Linux rename files as dirname](http://stackoverflow.com/questions/36539020/linux-rename-files-as-dirname) – pfnuesel Apr 12 '16 at 02:20
  • You asked exactly the same question already before and you even received answers on how to solve it. https://stackoverflow.com/questions/36539020/linux-rename-files-as-dirname – pfnuesel Apr 12 '16 at 02:21

1 Answers1

1

You can use this:

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

One-liner:

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

If the output is what you expect remove the echo.

Breakdown:

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

Sample (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
Reut Sharabani
  • 30,449
  • 6
  • 70
  • 88