Xargs übergibt die Eingabe an einen Befehl, der eine Pipe enthält

2729
Sridhar-Sarnobat

Um zu verstehen, wie man den Bindungsvorrang mit Pipes manipuliert, versuche ich, den Pfad einer Datei pro Verzeichnis auszudrucken - für jedes Verzeichnis:

find $PWD -type d | xargs --delimiter "\n" -I% -n 1 (find % -maxdepth 1 | head -1) 

Ich bekomme no matches found: (find % -maxdepth 1 | head -1). Ohne die Klammern würde ich bekommen, xargs: find: terminated by signal 13also bin ich mir ziemlich sicher, dass wir die Pfeifen irgendwie assoziativ machen müssen.

Wie übergebe ich die xargs-Eingabe an einen Befehl, der Pipes enthält? (Bitte sagen Sie mir nicht -exec, ich möchte lernen, wie man den Bindungsvorrang für andere Probleme manipuliert).

2

3 Antworten auf die Frage

2
Ipor Sircer

Hier sind Sie mit xargs:

find . -type d|xargs -I % sh -c 'find % -type f -maxdepth 1 | head -1' 

Aber denk dran: interne Schleife ist viel schneller!

time find $PWD -type d | while read dir;do find $dir -type f -maxdepth 1 | head -1;done >/dev/null  0m09.62s real 0m01.67s user 0m02.36s system time find . -type d|xargs -I % sh -c 'find % -type f -maxdepth 1 | head -1' >/dev/null  0m12.85s real 0m01.84s user 0m02.86s system 
Interessant. Ich möchte jedoch noch einmal die richtige Methode zur Manipulation von Pipe-Assoziativität lernen (sofern dies überhaupt möglich ist). Ich dachte, eine Subshell in geschweiften Klammern zu schaffen, würde den Trick tun, aber anscheinend nicht. Sridhar-Sarnobat vor 7 Jahren 0
Mit xargs haben Sie keine andere Lösung. Siehe unter: http://stackoverflow.com/questions/6958689/xargs-with-multiple-commands-as-argument Ipor Sircer vor 7 Jahren 1
Oh, deshalb magst du Xargs nicht. Oder zumindest verwandeln Sie mich deshalb in einen Xargs-Hasser :) Alles, was die Kraft der Schale wegwirft, ist eine Flash-in-the-Pan-Lösung. Sridhar-Sarnobat vor 7 Jahren 0
0
Ipor Sircer

Ich persönlich mag xargs nicht

find $PWD -type d | while read dir;do find $dir -type f -maxdepth 1 | head -1;done 
Gut zu wissen, dass es dies als Alternative gibt. Obwohl ich Schleifen hasse;) Sridhar-Sarnobat vor 7 Jahren 0
Sie werden bald _love_ loops! ; -> Ipor Sircer vor 7 Jahren 0
Auch wenn ich eine funktionale Programmiererin bin? Beim Schreiben von Java-Code versuche ich, Schleifen um jeden Preis zu vermeiden. Aber solange Schleifen nur eine Sache tun, ist es akzeptabel, wenn auch verbose :( Sridhar-Sarnobat vor 7 Jahren 0
0
Ipor Sircer

Und das ist die schnellste Lösung, bei der alles intern ist:

time find . -type d | while read dir;do for file in "$dir"/*;do if [ -f "$file" ]; then realpath $file;break;fi;done;done >/dev/null 0m00.21s real 0m00.08s user 0m00.10s system 

Unschlagbare Geschwindigkeit in der Schale. (Ich sagte, ich mag xargs nicht)