Câu hỏi làm thế nào để tránh không gian trong tên tập tin?


Tôi có một loạt các tệp cần được chuyển đổi từ .mp4 đến .mpeg.one. Một người bạn của tôi đã gợi ý cho tôi kịch bản đơn giản này. Tuy nhiên nó không hoạt động vì tên tập tin chứa các khoảng trống.

Đây là kịch bản:

for f in $(ls *.mp4); do ffmpeg -i "$f".mp4 "$f".mprg; done

3
2018-02-03 12:19


gốc


Tại sao bạn không nên phân tích đầu ra của ls (1) - slhck


Các câu trả lời:


Bạn không cần phải sử dụng ls trong trường hợp này. Như một quy tắc chung, luôn cố gắng sử dụng các nội trang hệ vỏ và các tính năng tổng quát thay vì dựa vào các chương trình bên ngoài (ví dụ: ls) có thể giới thiệu các vấn đề với cách giải quyết xấu.

Ngoài ra, bạn không nên 'theo cách thủ công' nối thêm phần mở rộng vào tên tệp đầu vào (cái mà bạn cung cấp cho -i) và bạn nên loại bỏ phần mở rộng trên tập tin đầu ra.

Vì vậy, lệnh nên là:

for f in *.mp4; do ffmpeg -i "$f" "${f%.mp4}".mprg; done

11
2018-02-03 12:32



Lưu ý rằng ffmpeg chọn định dạng vùng chứa đầu ra tùy thuộc vào phần mở rộng. Nếu bạn muốn một tiện ích mở rộng khác, bạn phải chỉ định định dạng vùng chứa - trong trường hợp này với -f mpeg. - phoibos


Thay vì ls, bạn có thể dùng find -print0 và xargs -0:

find -name '*.mp4' -print0 | xargs -0 -n1 ffmpeg -i '{}' '{}'.mpeg

Tiếp theo là đổi tên sau đó:

rename s/mp4.mpeg$/mpeg/ *.mp4.mpeg

4
2018-02-03 12:31





  • Không ls cần thiết
  • Bạn có thể có nghĩa là .mpeg dưới dạng tiện ích mở rộng
  • Nếu bạn đặt " đúng, không gian sẽ không phải là một vấn đề
  • ffmpeg -i "$f".mp4 trong lệnh của bạn sẽ tìm kiếm ví dụ: files.mp4.mp4, có thể bạn không có ý
  • Lưu ý rằng các tệp đầu ra của bạn sẽ được đặt tên, ví dụ: files.mp4.mpeg

Giải pháp có thể có:

for f in *.mp4; do ffmpeg -i "$f" "$f".mpeg; done

2
2018-02-03 12:39