顯示具有 xargs 標籤的文章。 顯示所有文章
顯示具有 xargs 標籤的文章。 顯示所有文章

2017年5月22日 星期一

[macOS] m3u/m3u8 -> grep -> xargs -> wget -> ffmpeg: ts -> mp4

目的是把 m3u8 的資料備份,接著又覺得檔案一堆,不如就用 ffmepg 轉 mp4 ,久久用一次,又忘得差不多。

連續動作:

$ wget http://.../index.m3u8 -O index.m3u8
$ grep -v "#" index.m3u8 | xargs wget
$ vim index.m3u8
:%s/http[^\/]+//g
:%s/?.*//g
$ grep -v "#" index.m3u8 | tr -d '\r' | awk '{cmd="mv "$1"* "$1; print cmd}'
$ grep -v "#" index.m3u8 | tr -d '\r' | awk '{cmd="mv "$1"* "$1; system(cmd)}'
$ ffmpeg -i index.m3u8 -vcodec copy -acodec copy -bsf:a aac_adtstoasc out.mp4

2017年2月7日 星期二

[Linux] 使用 xargs 執行任務,參數不只接在指令尾部

原先很習慣用 find 找到東西後,搭配 -exec 去執行任務,這時要串起來的指令很方便。然而,若是要在一個清單內,找到東西後,再接一串指令時,就會試試 xargs 這指令。只是 xargs 習慣都是把變數接在指令後頭:

$ grep 我 user.dict | xargs -n 1 echo | head -n 5
分我杯羹
天知地知,你知我知
禮豈為我設
誨爾諄諄,聽我藐藐
惠子知我


此例就是找到的關鍵字”我”,再丟給 echo 去印出來。但如果,想要把找到的關鍵字都包起來時:

找到”分我杯羹”了
找到”天知地知,你知我知”了
找到”禮豈為我設”了
找到”誨爾諄諄,聽我藐藐”了
找到”惠子知我”了


這時就會卡卡的,沒錯,就派 shell 上場了:

$ grep 我 user.dict | xargs -n 1 sh -c 'echo "找到\"${@}"\"了' "${0}" | head -n 5
找到"分我杯羹"了
找到"天知地知,你知我知"了
找到"禮豈為我設"了
找到"誨爾諄諄,聽我藐藐"了
找到"惠子知我"了


如此一來,透過 sh 在包一層,就可以完美使用 xargs 做事了。而我真正的需求是檢查一個檔案清單,查看清單內的檔案是否都存在:

$ grep keyword file-list.txt | xargs -n 1 sh -c 'test -r "${@}" || echo "${@} NOT FOUND" ' "${0}"