Có cách nào để sử dụng xargs trên một đường ống không?


15

Tôi đang cố gắng tự động chuyển đổi các tập tin flac được chuyển sang một thư mục thành mp3 trong một thư mục khác.

Dòng mã hiện tại của tôi là:

inotifywait -m -r -q -e moved_to --format "'%w%f'" ~/test |  xargs -I x flac -cd x - | lame -b 320 - /media/1tb/x.mp3

Để giải thích cách thức hoạt động cho đến nay, inotifywait màn hình ~ / kiểm tra đệ quy cho các tệp được di chuyển ở đó, xuất đường dẫn và tên tệp vào một đường ống. xargs lấy tên đó và tạo lệnh flac thích hợp, thay thế x bằng tên tệp và giải mã tệp sang một đường ống khác. Trong đường ống mới, què xử lý đầu ra của flac vào mp3 dưới / media. Tôi muốn xargs tiếp cận qua đường ống theo một cách nào đó, thay thế x trong lệnh què hoặc bằng một cách nào đó gửi nó đến một biến cả hai lệnh có thể truy cập hoặc một cái gì đó. Tôi đã cố gắng làm rối tung các ống có tên và nhạc jazz đó nhưng thực tế là có dữ liệu thực tế được đặt giữa hai lệnh khiến tôi phải lo lắng.

Câu trả lời:


16

Nếu tôi hiểu chính xác, bạn muốn kích hoạt một thể hiện flac … | lame …cho mỗi dòng đầu vào và nội suy đầu vào thành các đối số cho cả hai lệnh.

Vì bạn cần xargsbắt đầu một đường ống, bạn cần làm cho nó bắt đầu một chương trình có khả năng tạo ra các đường ống, tức là một vỏ.

inotifywait -m -r -q -e moved_to --format "%w%f" ~/test |
xargs -l sh -c 'flac -cd "$0" - | lame -b 320 - "/media/1tb/$0.mp3"'

Ngoài ra, có vỏ gọi từng dòng một và chạy đường ống.

inotifywait -m -r -q -e moved_to --format "%w%f" ~/test |
while IFS= read -r file; do
  flac -cd "$file" - | lame -b 320 - "/media/1tb/$file.mp3"
done

Lưu ý rằng định dạng %w%ftạo ra một đường dẫn tuyệt đối, mà bạn đang chuẩn bị /media/1tbvà nối thêm .mp3. Nếu bạn muốn loại bỏ phần thư mục của tệp trong lamelệnh, hãy đổi $filethành ${file##*/}. Nếu bạn muốn loại bỏ phần mở rộng, hãy đổi $filethành ${file%.*}. Nếu bạn muốn làm cả hai, bạn sẽ phải làm theo hai bước. Nếu bạn muốn tạo lại hệ thống phân cấp thư mục bên dưới /media/1tb, bạn có thể sử dụng mkdir -p.

cd ~/test
inotifywait -m -r -q -e moved_to --format "%w%f" . |
while IFS= read -r file; do
  [ -f "$file" ] || continue; # skip directories and other special files
  dir=${file%/*}; file=${file##*/}
  mkdir -p "/media/1tb/$dir"
  flac -cd "$dir/$file" - | lame -b 320 - "/media/1tb/$dir/${file#.*}.mp3"
done

3

Bạn có thể thử một cái gì đó như:

inotifywait -m -r -q -e moved_to --format "'%w%f'" ~/test \
    | while read x; do \
        flac -cd "$x" - | lame -b 320 - "/media/1tb/$x.mp3"
    done;

1
while read …là một giải pháp, nhưng sau đó, thả xargs. Những gì bạn viết chỉ không có ý nghĩa: bạn nghĩ nơi nào xargsnhận được đầu vào của nó? Và bạn nên trích dẫn mọi thứ một cách chính xác, thông thường tên tệp nhạc có chứa khoảng trắng.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Không rõ ràng với tôi chính xác những gì OP đang làm, đó là lý do tại sao tôi nói "bạn có thể thử một cái gì đó như " và "Tôi không chắc liệu bit xargs có đúng với ý định của bạn không" v.v. Vì vậy, không phải là câu trả lời tốt nhất mà là một gợi ý đúng hướng, tôi nghĩ vậy. Đã sửa lỗi trích dẫn và xóa xargs.
goldilocks
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.