Problem mit xargs unter Linux


1

Ich versuche, die Ausgabe von youtube-dl an zu leiten, xargsda ich die heruntergeladene Datei mit dem Titel benennen möchte, der aus dem ersten Befehl extrahiert wurde. Ich habe jedoch Probleme damit. Der Befehl, den ich benutze, ist wie folgt;

youtube-dl --get-title "Youtube URI" | xargs youtube-dl -o {} "YouTube URI"


Xargs kann nicht mit Leerzeichen "und" umgehen, es sei denn, Sie übergeben das Flag -0. Außerdem kenne ich youtube-dl nicht, aber möglicherweise werden keine Standardeingaben verwendet, sodass xargs unbrauchbar wäre.
Bruno9779

@ Bruno9779 - Was meinst du mit "Leerzeichen" und "? Woher weiß ich, ob eine Anwendung wie" youtube-dl "die Standardeingabe übernimmt?
PeanutsMonkey 11.06.12

Ich meine das Leerzeichen, Anführungszeichen und Anführungszeichen. Lesen Sie die Manpages von xargs, um mehr darüber und über stdi / o zu erfahren (das alles möchte ich hier nicht einfügen). Es sieht so aus, als ob youtube-dl nur URLs als stdin akzeptiert, sodass dein Befehl IMO nicht funktionieren kann. Versuchen Sie es
trotzdem

@ Bruno9779: -0würde einen Dateinamen mit dem endenden Zeilenumbruchzeichen erzeugen, was erlaubt, aber oft nervig ist. Wenn kein anderes Trennzeichen mit angegeben ist -d, wird xargsstandardmäßig \n("newline") verwendet, was in diesem Fall angemessen ist.
Daniel Andersson

Antworten:


3

Um Ihre spezielle Frage zu beantworten xargs, müssen Sie angeben, dass Sie den {}Platzhalter verwenden möchten :

youtube-dl --get-title "Youtube URI" |\
    xargs -I{} youtube-dl -o {} "Youtube URI"

Siehe man xargsfür weitere Informationen und welche Schalter sind auch impliziert -I.

Da es sich nur um ein einziges Argument handelt, ist die Verwendung der Substitution einfacher:

youtube-dl -o "$(youtube-dl --get-title "Youtube URI")" "Youtube URI"

Beachten Sie, dass Sie mit diesen Konstruktionen eine Datei ohne entsprechende Dateierweiterung erhalten.

Der einfachste Weg, um Ihre eigentliche Aufgabe zu erfüllen, ist, wie bereits erwähnt, die Verwendung der integrierten Option zur Benennung von Titeln:

youtube-dl -t "Youtube URI"

wie beschrieben in man youtube-dl. Dadurch wird auch die richtige Dateierweiterung für die Videodatei erstellt.


Vielen Dank. Ich folge nicht ganz dem, was Sie damit meinen. Ich muss angeben, dass ich den Platzhalter {} verwenden möchte. Meines Wissens ist {} ein Platzhalter für die Ausgabe, die im vorhergehenden Befehl erzeugt wurde.
PeanutsMonkey

@PeanutsMonkey: Nein, normalerweise werden xargsnur alle eingehenden Argumente nach dem angegebenen Befehl angehängt. echo foo bar | xargs -d' ' echo bazwird baz foo barin einer einzelnen Zeile gedruckt ; Die Argumente wurden an einen einzelnen echo Aufruf angehängt . Der {}Platzhalter ist ein spezielles Konstrukt und muss explizit mit aktiviert werden -I, wie im Handbuch angegeben.
Daniel Andersson

2

Ich habe YouTube-dl-Manpages gelesen: Was du versuchst, ist viel einfacher als das, du brauchst nur das -t, - title-Flag.

youtube-dl --title "Youtube URL"

oder

youtube-dl -t "Youtube URL"

http://dev.man-online.org/man1/youtube-dl/


Der Grund, warum ich youtube-dl --title "YouTube URL" is because it has a different output to that of youtube-dl --get-title "Youtube URL" vermeiden möchte .
PeanutsMonkey
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.