Saya akan memposting dua solusi lagi dengan harapan mereka dapat membantu di masa depan. Ini berasal dari admin Linux di tempat kerja. Cukup tunjukkan berapa banyak palu yang bisa digunakan pada paku ini!
Solusi 1:
Hai Denham,
Saya harus membuat beberapa asumsi di sini, misalnya bahwa bagian dari direktori dengan "XXX Season #" akan selalu menjadi direktori "luar" (leaf node).
Bagaimanapun, saya akan menulis naskah kecil. Sesuatu seperti ini seharusnya berfungsi (perhatikan tanda kutip ganda di sekitar variabel, untuk memastikan Anda menangkap semua spasi di direktori):
find /media/Expansion2/Series/ -type d | while read olddir
do
newdir=`echo "${olddir}" | awk -F "/" '$NF ~ /Season/ { last=substr($NF,index($NF, "Season")); while (i<(NF-1)) { i++; printf("/%s", $i) }; printf("/%s\n", last) } $NF !~ /Season/ { print }'`
if [ "${olddir}" != "${newdir}" ]
then
mv "${olddir}" "${newdir}"
fi
done
Tentu saja, sebelum Anda menjalankannya dengan perintah "mv" $ {olddir} "" $ {newdir} "" Anda harus meletakkan sesuatu seperti "echo" $ {olddir} "" $ {newdir} "" untuk memastikan Anda mendapatkan hasil yang Anda harapkan atau Anda bisa berakhir dengan sakit kepala lain :-P
Solusi 2:
Hai Denham,
Sebagian besar jawabannya sudah ada di pertanyaan. Bagaimanapun menjalankan sesuatu seperti berikut dari folder Series akan berfungsi dengan baik:
find -mindepth 2 -maxdepth 2 -type d | while read dir; do mv -T "$dir" "`dirname "$dir"`/`basename "$dir" | sed "s/.*Season \([0-9]*\)$/Season \1/i"`"; done
Penjelasan:
• find -mindepth 2 -maxdepth 2 -type d (daftar direktori dua tingkat kebawah)
• saat membaca dir; (loop pada setiap dir)
• mv -T "$ dir" (pindahkan dir sumber ke ... -T diperlukan untuk mendapatkan kesalahan jika folder Musim tidak unik yaitu Anda tidak memiliki "The Big Bang Theory Season 22 "dan" Musim 22 "di direktori yang sama)
• dirname" $ dir "mengembalikan path di mana dir adalah
• basename" $ dir "mengembalikan nama direktori
• sed" s /. Musim ([0-9] ) $ / Musim \ 1 / i "menyelesaikan keajaiban dengan regexp case sensitif, untuk berjaga-jaga.
Dalam tes kecil saya itu berhasil (coba dulu dengan gema sebelum mv):
someuser@linux-box:/tmp/Series$ find
.
./The Big Bang Theory
./The Big Bang Theory/Season 2
./The Big Bang Theory/Season 2/file1.avi
./The Big Bang Theory/Season 2/file 3.avi
./The Big Bang Theory/Season 2/file2.avi
./The Big Bang Theory/Season 2/file
./The Big Bang Theory/Season 2/3.avi
./The Big Bang Theory/The Big Bang Theory Season 1
./The Big Bang Theory/The Big Bang Theory Season 1/file1.avi
./The Big Bang Theory/The Big Bang Theory Season 1/file 3.avi
./The Big Bang Theory/The Big Bang Theory Season 1/file2.avi
./The Big Bang Theory/The Big Bang Theory Season 1/file
./The Big Bang Theory/The Big Bang Theory Season 1/3.avi
./Other Series
./Other Series/Season 2
./Other Series/Stre dsfdf sd dSeason 3
someuser@linux-box:/tmp/Series$ find -mindepth 2 -maxdepth 2 -type d | while read dir; do mv -T "$dir" "dirname "$dir"
/basename "$dir" | sed "s/.*Season \([0-9]*\)$/Season \1/i"
"; done
mv: ./The Big Bang Theory/Season 2' and
./The Big Bang Theory/Season 2' are the same file
mv: ./Other Series/Season 2' and
./Other Series/Season 2' are the same file
someuser@linux-box:/tmp/Series$ find
.
./The Big Bang Theory
./The Big Bang Theory/Season 2
./The Big Bang Theory/Season 2/file1.avi
./The Big Bang Theory/Season 2/file 3.avi
./The Big Bang Theory/Season 2/file2.avi
./The Big Bang Theory/Season 2/file
./The Big Bang Theory/Season 2/3.avi
./The Big Bang Theory/Season 1
./The Big Bang Theory/Season 1/file1.avi
./The Big Bang Theory/Season 1/file 3.avi
./The Big Bang Theory/Season 1/file2.avi
./The Big Bang Theory/Season 1/file
./The Big Bang Theory/Season 1/3.avi
./Other Series
./Other Series/Season 3
./Other Series/Season 2