Tôi đang cố gắng di chuyển các tệp như thế này:
...
DLG023-00-01-sprite.TextGrid.json
DLG023-00-01.prosody.json
DLG023-01-01-sprite.ogg
DLG023-00-02-sprite.TextGrid.json
DLG023-00-02.prosody.json
DLG023-01-02-sprite.ogg
...
DLG028-00-01-sprite.TextGrid.json
DLG028-00-01.prosody.json
DLG028-01-01-sprite.ogg
...
vào các thư mục tương ứng của chúng, ví dụ: di chuyển tệp đến dialogue023/
khi bắt đầu bằng DLG023
; đến dialogue024/
khi nó bắt đầu với DLG024
; vân vân
Tất cả các tập tin và thư mục ở cùng một cấp độ.
Nói cách khác, tôi đang cố gắng tạo ra các lệnh như thế này:
mv DLG023-00-01-sprite.ogg dialogue023/
Làm thế nào tôi có thể trích xuất số đầu tiên từ tên tệp?
Cho đến nay tôi đã có điều này:
for i in DLG*-*-*-sprite.ogg; do echo "${i//[^0-9]}";done
Nhưng điều này xuất ra tất cả các chữ số (ví dụ: 230001) khi tôi chỉ muốn cái đầu tiên (ví dụ: 23).
for num in $(seq -f '%03g' 1 999); do test -d dialogue${num}||mkdir dialogue${num}; mv -t dialogue${num} DLG${num}-*; done
saurmdir dialogue*
--f '%03g'
có nghĩa là tất cả các số được đệm bằng 0 đến ít nhất ba chữ số và vì 999 phù hợp với ba chữ số tất cả các số sẽ trở thành ba chữ số dài trong tên thư mục. Đồng bằngrmdir
không thành công nếu thư mục không trống, vì vậy an toàn. Cú đúp cho đầu ra lỗi không quan trọng từmv
khoảng các tệp không tồn tại.