GNU/Linux >> Tutoriels Linux >  >> Linux

Ny façon d'utiliser Xargs à travers un tuyau?

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 - //eadn-wc01-5196795.nxedge.io/media/1tb/x.mp3

Pour expliquer comment cela fonctionne jusqu'à présent, inotifywait surveille ~/test de manière récursive les fichiers qui y sont déplacés, en affichant le chemin et le nom du fichier dans un tube. xargs prend ce nom et crée la commande flac appropriée, en remplaçant x par le nom de fichier et en décodant le fichier vers un autre tube. Dans le nouveau tube, lame transforme la sortie de flac en mp3 sous /media. Je veux que xargs atteigne le tuyau d'une manière ou d'une autre, en remplaçant le x dans la commande boiteuse ou l'envoie d'une manière ou d'une autre à une variable à laquelle les deux commandes peuvent accéder ou quelque chose du genre. J'ai essayé de jouer avec les canaux nommés et ce jazz, mais le fait qu'il y ait des données réelles acheminées entre les deux commandes me dépasse.

Réponse acceptée :

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

Puisque vous avez besoin de xargs pour dé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 - "//eadn-wc01-5196795.nxedge.io/media/1tb/$0.mp3"'

Vous pouvez également demander 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 - "//eadn-wc01-5196795.nxedge.io/media/1tb/$file.mp3"
done

Notez que le format %w%f produit un chemin absolu, auquel vous ajoutez /media/1tb et en ajoutant .mp3 . Si vous souhaitez supprimer la partie répertoire du fichier dans le lame commande, modifiez $file vers ${file##*/} . Si vous souhaitez supprimer l'extension, modifiez $file à ${file%.*} . Si vous voulez faire les deux, vous devrez le faire en deux étapes. Si vous souhaitez reproduire la hiérarchie des 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 - "//eadn-wc01-5196795.nxedge.io/media/1tb/$dir/${file#.*}.mp3"
done

Linux
  1. Comment utiliser les canaux et les canaux nommés sous Linux (avec exemples)

  2. Comment utiliser les pages de manuel pour apprendre à utiliser les commandes ?

  3. La meilleure façon de gérer les utilisateurs sur plusieurs serveurs ?

  4. Ny Way pour utiliser Windows Live Messenger dans Ubuntu?

  5. Sortie de canal à utiliser comme spécification de recherche pour grep sous Linux

Frayez-vous un chemin à travers votre terminal Linux

Comment utiliser la commande Linux xargs

Docker :Comment l'utiliser de manière pratique - Partie 3

Façon de rechercher des pages de manuel pour un scénario d'utilisation typique ?

Tuyau B à D ? – A &&B || C | RÉ?

Comment utiliser la commande xargs sous Linux ?