Snažím se automaticky převést soubory flac přesunuté do složky na mp3 v jiné složce.
Můj aktuální řádek kódu je tento:
inotifywait -m -r -q -e moved_to --format "'%w%f'" ~/test | xargs -I x flac -cd x - | lame -b 320 - //eadn-wc01-5196795.nxedge.io/media/1tb/x.mp3
Abychom vysvětlili, jak to zatím funguje, inotifywait rekurzivně monitoruje ~/test pro soubory, které jsou tam přesunuty, a vydává cestu a název souboru do kanálu. xargs převezme tento název a vytvoří správný příkaz flac, nahradí x názvem souboru a dekóduje soubor do jiného kanálu. V novém potrubí lame zpracovává výstup flac do mp3 pod /media. Chci, aby se xargs nějakým způsobem dostaly přes potrubí a nahradily x v příkazu lame nebo je nějakým způsobem poslaly do proměnné, ke které mají oba příkazy přístup nebo tak něco. Zkoušel jsem si pohrávat s pojmenovanými rourami a tím jazzem, ale skutečnost, že mezi těmito dvěma příkazy jsou přenášena skutečná data, mi vrtá hlavou.
Přijatá odpověď:
Pokud tomu dobře rozumím, chcete spustit jednu instanci flac … | lame …
pro každý vstupní řádek a interpolovat vstup do argumentů obou příkazů.
Protože potřebujete xargs
ke spuštění pipeline musíte spustit program, který je schopen vytvářet potrubí, tj. shell.
inotifywait -m -r -q -e moved_to --format "%w%f" ~/test |
xargs -l sh -c 'flac -cd "$0" - | lame -b 320 - "//eadn-wc01-5196795.nxedge.io/media/1tb/$0.mp3"'
Případně nechte volající shell číst řádky jeden po druhém a spusťte kanál.
inotifywait -m -r -q -e moved_to --format "%w%f" ~/test |
while IFS= read -r file; do
flac -cd "$file" - | lame -b 320 - "//eadn-wc01-5196795.nxedge.io/media/1tb/$file.mp3"
done
Všimněte si, že formát %w%f
vytvoří absolutní cestu, ke které přidáte /media/1tb
a připojením .mp3
. Pokud chcete odstranit adresářovou část souboru v lame
příkaz, změňte $file
na ${file##*/}
. Pokud chcete příponu odstranit, změňte $file
do ${file%.*}
. Pokud chcete udělat obojí, budete to muset udělat ve dvou krocích. Pokud chcete reprodukovat hierarchii adresářů pod /media/1tb
, můžete použít 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 - "//eadn-wc01-5196795.nxedge.io/media/1tb/$dir/${file#.*}.mp3"
done