ฉันจะโพสต์โซลูชันสองรายการเพิ่มเติมโดยหวังว่าพวกเขาจะมีประโยชน์ในอนาคต สิ่งเหล่านี้มาจากผู้ดูแลระบบ Linux ในที่ทำงาน เพียงไปเพื่อแสดงจำนวนค้อนจะทำงานกับเล็บนี้!
โซลูชันที่ 1:
สวัสดีเดนแฮม
ฉันต้องตั้งสมมติฐานบางอย่างที่นี่เช่นส่วนของไดเรกทอรีที่มี "XXX Season #" จะเป็นไดเรกทอรี "นอก" เสมอ (โหนดปม)
ไม่ว่าในกรณีใดฉันจะเขียนบทเล็กน้อย สิ่งนี้ควรใช้งานได้ (สังเกตเครื่องหมายอัญประกาศคู่รอบตัวแปรเพื่อให้แน่ใจว่าคุณได้จับช่องว่างทั้งหมดในไดเรกทอรี):
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
แน่นอนก่อนที่คุณจะรันด้วยคำสั่ง "mv" $ {olddir} "" $ {newdir} "" คุณควรใส่บางอย่างเช่น "echo" $ {olddir} "" $ {newdir} "" เพื่อให้แน่ใจว่าคุณ รับผลลัพธ์ที่คุณคาดหวังหรือคุณอาจปวดหัวอีกครั้ง :-P
โซลูชันที่ 2:
สวัสดีเดนแฮม
คำตอบส่วนใหญ่อยู่ในคำถามแล้ว อย่างไรก็ตามการทำงานบางอย่างเช่นรายการต่อไปนี้จากโฟลเดอร์ 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
คำอธิบาย:
• find -mindepth 2 -maxdepth 2 -type d (แสดงรายการไดเร็กทอรีสองระดับ)
•ขณะที่อ่าน dir; (วนรอบแต่ละ dir)
• mv -T "$ dir" (ย้าย dir ต้นทางไปที่ ... - T จำเป็นต้องได้รับข้อผิดพลาดหากโฟลเดอร์ Season ไม่ซ้ำกันนั่นคือคุณไม่มี "The Big Bang Theory Season 22 "และ" Season 22 "ในไดเรกทอรีเดียวกัน)
• dirname" $ dir "ส่งคืนพา ธ ที่ dir คือ
• basename" $ dir "ส่งคืนชื่อของไดเรกทอรี
• sed" s /. Season ([0-9] ) $ / Season \ 1 / i "ทำเวทย์มนตร์ให้สมบูรณ์ด้วยตัวพิมพ์เล็กและใหญ่ regexp ในกรณี
ในการทดสอบขนาดเล็กของฉันมันใช้งานได้ (ลองก่อนด้วยเสียงก้องก่อน 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