Tôi sẽ đăng thêm hai giải pháp với hy vọng chúng có thể hữu ích trong tương lai. Chúng đến từ các quản trị viên Linux tại nơi làm việc. Chỉ cần đi để cho thấy có bao nhiêu búa sẽ làm việc trên móng tay này!
Giải pháp 1:
Xin chào
Tôi phải đưa ra một vài giả định ở đây, ví dụ, một phần của thư mục có "XXX Season #" sẽ luôn là thư mục "bên ngoài" (nút lá).
Trong mọi trường hợp, tôi sẽ viết một kịch bản nhỏ. Một cái gì đó như thế này sẽ hoạt động (lưu ý các dấu ngoặc kép xung quanh các biến, để đảm bảo bạn nắm bắt tất cả các khoảng trắng trong thư mục):
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
Tất nhiên, trước khi bạn chạy nó bằng lệnh "mv" $ {olddir} "" $ {newdir} "" bạn nên đặt một cái gì đó như "echo" $ {olddir} "" $ {newdir} "" để đảm bảo bạn nhận được kết quả mà bạn mong đợi hoặc bạn có thể kết thúc với một cơn đau đầu khác :-P
Giải pháp 2:
Xin chào
Hầu hết các câu trả lời đã có trong câu hỏi. Dù sao, chạy một cái gì đó như sau từ thư mục Series sẽ hoạt động tốt:
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
Giải thích:
• find -mindepth 2 -maxdepth 2 -type d (liệt kê các thư mục xuống hai cấp)
• trong khi đọc dir; (lặp trên mỗi thư mục)
• mv -T "$ dir" (di chuyển thư mục nguồn sang ... -T là cần thiết để gặp lỗi nếu các thư mục Mùa không phải là duy nhất tức là bạn không có "Mùa lý thuyết Big Bang 22 "và" Phần 22 "trong cùng thư mục)
• dirname" $ dir "trả về đường dẫn trong đó thư mục là
• tên cơ sở" $ dir "trả về tên của thư mục
• sed" s /. Season ([0-9] ) $ / Season \ 1 / i "hoàn thành phép thuật với regrec không phân biệt chữ hoa chữ thường, chỉ trong trường hợp.
Trong thử nghiệm nhỏ của tôi, nó đã hoạt động (thử trước với tiếng vang trước 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