Existe-t-il un moyen d'utiliser des xargs sur un tube?

15

J'essaie de convertir automatiquement les fichiers flac déplacés vers un dossier en mp3 dans un autre dossier.

Ma ligne de code actuelle est la suivante:

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

Pour expliquer comment cela fonctionne jusqu'à présent, inotifywait surveille récursivement ~ / test pour les fichiers qui y sont déplacés, produisant le chemin et le nom de fichier dans un canal. xargs prend ce nom et crée la commande flac appropriée, remplaçant x par le nom de fichier et décodant le fichier vers un autre canal. Dans le nouveau tube boiteux traite la sortie de flac en mp3 sous / media. Je veux que xargs atteigne le canal d'une manière ou d'une autre, en remplaçant le x dans la commande boiteuse ou en quelque sorte l'envoie à une variable à laquelle les deux commandes peuvent accéder ou quelque chose. J'ai essayé de jouer avec les pipes nommées et ce jazz, mais le fait qu'il y ait des données réelles étant canalisées entre les deux commandes m'a sur le coup.

sagev9000
la source

Réponses:

16

Si je comprends bien, vous voulez déclencher une instance flac … | lame …pour chaque ligne d'entrée et interpoler l'entrée dans les arguments des deux commandes.

Puisque vous devez xargsdémarrer un pipeline, vous devez lui faire démarrer un programme capable de créer des pipelines, c'est-à-dire un shell.

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

Sinon, demandez au shell appelant de lire les lignes une par une et d'exécuter le pipeline.

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

Notez que le format %w%fproduit un chemin absolu, auquel vous ajoutez /media/1tbet ajoutez .mp3. Si vous souhaitez supprimer la partie répertoire du fichier dans la lamecommande, passez $fileà ${file##*/}. Si vous souhaitez supprimer l'extension, passez $fileà ${file%.*}. Si vous voulez faire les deux, vous devrez le faire en deux étapes. Si vous souhaitez reproduire la hiérarchie de répertoires sous /media/1tb, vous pouvez utiliser 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
Gilles 'SO- arrête d'être méchant'
la source
3

Vous pouvez essayer quelque chose comme:

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;
boucle d'or
la source
1
while read …est une solution, mais alors, laissez tomber xargs. Ce que vous avez écrit n'a tout simplement pas de sens: où pensez-vous xargsobtenir son entrée? Et vous devez citer les choses correctement, il est courant que les noms de fichiers musicaux contiennent des espaces.
Gilles 'SO- arrête d'être méchant'
@Gilles Ce n'était pas / n'est pas clair pour moi exactement ce que fait l'OP, c'est pourquoi j'ai dit "vous pouvez essayer quelque chose comme " et "je ne sais pas si le bit xargs est fidèle à vos intentions", etc. Ce n'est donc pas la meilleure réponse mais un indice dans la bonne direction, je pense. Correction du problème de citation et suppression des xargs.
goldilocks