Cách tốt nhất để loại bỏ phần mở rộng tập tin từ một chuỗi?


7

Vì vậy, tôi đang sử dụng tập lệnh tôi đã tạo để chuyển đổi video sang định dạng webm. Một chương trình nhất định gọi tập lệnh, gửi %ftên đầy đủ, tuyệt đối của video, như thế này:

converter.sh %f

nơi %fcó hai phần mở rộng có thể, .avihoặc .mpg.

# /bin/bash
ffmpeg -i $1 `dirname $1``basename $1 avi`webm && rm $1

Nó hiện đang hoạt động hoàn hảo khi $1chứa một .avitệp, vì basenameloại bỏ .aviphần mở rộng. Khi $1kết thúc với .mpgthay thế, kết quả là .mpgwebm.

Làm cách nào tôi có thể sửa đổi tập lệnh đó để có thể nhận hai định dạng khác nhau có thể?


Tiếp tục: Nếu $1/somedir/video.avi, kịch bản nên làm:

ffmpeg -i /somedir/video.avi /somedir/video.webm

Và nếu $1/somedir/video.mpg, kịch bản nên làm:

ffmpeg -i /somedir/video.mpg /somedir/video.webm

Tôi biết điều này có thể là ngu ngốc đối với một số người, nhưng tôi là người mới với bash.

Câu trả lời:


9

Bạn có thể sử dụng các cơ chế thay thế được cung cấp bởi hầu hết các shell:

B=$(basename "$1"); D=$(dirname "$1");
ffmpeg -i "$1" "$D/${B%.*}.webm" && rm "$1"

Trong thực tế, basenamedirnamecũng có thể được mô phỏng bằng sự thay thế.

Lưu ý: .*loại bỏ hậu tố trực tiếp là không chính xác trên các đường dẫn như this.dir/file.


1
Tôi đã cho phép bản thân trích dẫn biến số và thay thế backquote bằng cách$(…)
Stéphane Gimenez

Có, nhưng các tệp sẽ được đặt tên *.avi.webmhoặc *.mpg.webmbasenamekhông xóa phần mở rộng trừ khi bạn chỉ định nó sau.
Tomas

Xin lỗi, câu trả lời đầu tiên của tôi là ngu ngốc! Đã chỉnh sửa và vẫn cần cải thiện.
Stéphane Gimenez

2
@Tomas: Không có dấu ngoặc kép và trong trường hợp tên tệp của bạn chứa khoảng trắng, chúng sẽ được chia thành nhiều đường dẫn.
Stéphane Gimenez

2
Tại sao sử dụng dirname, basename. Và không sử dụng trực tiếp 'ffmpeg -i "$ 1" "$ {. 1% *} webm" && rm "$ 1"
enzotib
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.