2016-04-11 4 views
-1

Я получил файлы, как это:Linux Bash переименовывать файлы

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

Суб-Dir имя unique.I нужно переименовать их командой Баш или 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 

Sample (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