Tôi còn khá mới với Bash và đang cố gắng làm một cái gì đó trên bề mặt có vẻ khá đơn giản - hãy chạy tìm trên một hệ thống phân cấp thư mục để lấy tất cả các tệp * .wma, dẫn đến một lệnh mà tôi chuyển đổi chúng sang mp3 và lưu tệp đã chuyển đổi dưới dạng .mp3. Tôi nghĩ rằng lệnh sẽ giống như sau (Tôi đã bỏ lệnh chuyển đổi âm thanh và thay vào đó là sử dụng echo để minh họa):
$ find ./ -name '*.wma' -type f -print0 | xargs -0 -I f echo ${f%.*}.mp3
Theo tôi hiểu, -print0 arg sẽ cho phép tôi xử lý tên tệp có khoảng trắng (mà nhiều trong số này làm như chúng là các tệp nhạc). Sau đó, tôi đang mong đợi (là kết quả của xargs) rằng mỗi đường dẫn tệp từ find được ghi lại trong f và sử dụng khớp / xóa chuỗi con từ cuối chuỗi, rằng tôi nên lặp lại đường dẫn tệp gốc bằng mp3 mở rộng thay vì wma. Tuy nhiên, thay vì kết quả này, tôi thấy như sau:
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
...
Vì vậy, câu hỏi của tôi (ngoài 'cụ thể tôi đang làm gì sai ở đây'), là đây - làm các giá trị là kết quả của một hoạt động đường ống cần được xử lý khác nhau trong các hoạt động thao tác chuỗi so với các kết quả của phép gán biến ?
{}
thành viên)
xargs
là phù hợp hơn exec
. Xem stackpost stackoverflow.com/questions/896808/find-exec-cmd-vs-xargs để biết trường hợp cụ thể.
xargs
vớifind
. Nó đi kèm với một-exec
tùy chọn. Bạn có thể chỉ cần thêm lệnh bạn sẽ sử dụng vào câu hỏi của bạn và ai đó có thể chỉ cho bạnfind
lệnh chính xác ?