มีวิธีการใช้ xargs ข้ามท่อหรือไม่?


15

ฉันพยายามแปลงไฟล์ flac ที่ย้ายไปยังโฟลเดอร์เป็น mp3 ในโฟลเดอร์อื่นโดยอัตโนมัติ

บรรทัดรหัสปัจจุบันของฉันคือ:

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

เพื่ออธิบายวิธีการใช้งานจนถึงตอนนี้ inotifywait จอภาพ ~ / ทดสอบวนซ้ำสำหรับไฟล์ที่ย้ายไปที่นั่นเอาท์พุทพา ธ และชื่อไฟล์ไปยังไพพ์ xargs ใช้ชื่อนั้นและสร้างคำสั่ง flac ที่เหมาะสมแทนที่ x ด้วยชื่อไฟล์และถอดรหัสไฟล์ไปยังไพพ์อื่น ในไปป์ใหม่ประมวลผลเอาต์พุตของ flac เป็น mp3 ภายใต้ / สื่อ ฉันต้องการ xargs เพื่อเข้าถึงข้ามไปป์ในทางใดทางหนึ่งแทนที่ x ในคำสั่ง lame หรือในบางวิธีส่งไปยังตัวแปรที่ทั้งสองคำสั่งสามารถเข้าถึงหรืออะไรก็ได้ ฉันลองเล่นไปรอบ ๆ กับไปป์ที่มีชื่อและแจ๊สนั่น แต่ความจริงที่ว่ามีข้อมูลจริงที่ถูกไพพ์ระหว่างคำสั่งสองคำสั่งให้ฉันเข้ามาในหัวของฉัน

คำตอบ:


16

หากฉันเข้าใจถูกต้องคุณต้องการเริ่มต้นหนึ่งอินสแตนซ์flac … | lame …สำหรับแต่ละบรรทัดอินพุตและแก้ไขอินพุตให้เป็นอาร์กิวเมนต์ของคำสั่งทั้งสอง

เนื่องจากคุณต้องxargsเริ่มต้นขั้นตอนการทำงานคุณต้องทำให้มันเริ่มต้นโปรแกรมที่สามารถสร้างท่อได้เช่นเชลล์

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"'

หรือให้เชลล์ที่เรียกใช้อ่านบรรทัดทีละหนึ่งและเรียกใช้ไปป์ไลน์

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

โปรดทราบว่ารูปแบบ%w%fผลิตเส้นทางแน่นอนที่คุณกำลัง prepending และท้าย/media/1tb .mp3หากคุณต้องการที่จะตัดออกเป็นส่วนหนึ่งไดเรกทอรีของแฟ้มในlameคำสั่งเปลี่ยนแปลงไป$file ${file##*/}หากคุณต้องการที่จะตัดออกจากการขยายการเปลี่ยนแปลงไป$file ${file%.*}หากคุณต้องการทำทั้งสองอย่างคุณจะต้องทำสองขั้นตอน หากคุณต้องการที่จะทำซ้ำภายใต้ไดเรกทอรีลำดับชั้นคุณสามารถใช้/media/1tbmkdir -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

คุณสามารถลองสิ่งที่ชอบ:

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 …เป็นวิธีแก้ปัญหา xargsแต่แล้วลดลง สิ่งที่คุณเขียนไม่สมเหตุสมผล: คุณคิดว่าxargsจะรับความคิดเห็นจากที่ไหน และคุณควรพูดอย่างถูกต้องเป็นเรื่องปกติที่ชื่อไฟล์เพลงจะมีช่องว่าง
Gilles 'หยุดความชั่วร้าย'

@Gilles มันไม่ได้ / ไม่ชัดเจนสำหรับฉันในสิ่งที่ OP กำลังทำอยู่นั่นคือเหตุผลที่ฉันพูดว่า "คุณสามารถลองอะไรบางอย่าง " และ "ฉันไม่แน่ใจว่าบิต xargs นั้นเป็นความจริงตามที่คุณตั้งใจหรือไม่" ไม่ใช่คำตอบที่ดีที่สุด แต่เป็นคำใบ้ในทิศทางที่ถูกต้องฉันคิดว่า แก้ไขปัญหาการอ้างอิงและลบ xargs แล้ว
goldilocks
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.