GNU/Linux >> Znalost Linux >  >> Linux

Jaký způsob použití Xargs napříč potrubím?

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

Linux
  1. Výstup roury, který se má použít jako vyhledávací specifikace pro grep v Linuxu

  2. Jaký je správný způsob použití inotify?

  3. Mohu použít avahi k publikování služby napříč podsítěmi?

  1. Funguje nohup přes potrubí?

  2. Mohu použít výstup potrubí jako argument skriptu shellu?

  3. Správný způsob použití OnFailure v systemd

  1. Jak používat Pipes a Named Pipes v Linuxu (s příklady)

  2. Způsob, jak hledat v manuálových stránkách scénář typického použití?

  3. Nejlepší způsob, jak spravovat uživatele na více serverech?