2016-04-11 11 views
-1

bekam ich Dateien wie folgen aus:Linux Bash Umbenennen von Dateien

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

Der Sub-dir Name ist unique.I wollen, dass sie dies durch bash Befehl oder scipts umbenennen:

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

oder wie dies:

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

Gibt es eine Möglichkeit, sie zu konvertieren? Vielen Dank!!!

+0

Mögliche Duplikat [Linux Umbenennen von Dateien als dirname] (http://stackoverflow.com/questions/36539020/linux- rename-files-as-dirname) – pfnuesel

+0

Sie haben genau die gleiche Frage schon vorher gestellt und Sie haben sogar Antworten darauf bekommen, wie Sie es lösen können. https://stackoverflow.com/questions/36539020/linux-rename-files-as-dirname – pfnuesel

Antwort

1

Sie können diese verwenden:

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 

Wenn die Ausgabe ist, was Sie den echo entfernen erwarten.

Aufteilung:

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 

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