`if` Anweisung mit stdout && Xargs durch Pipe übergeben

0

Angenommen, ich habe eine list.txtder Dateien, die ich überprüfen möchte.

cat list.txt

und für jede Datei möchte ich eine Aktion ausführen

cat list.txt | xargs -I {} touch {}

Aber je nach Ausgang der Aktion möchte ich entsprechend reagieren:

cat list.txt | xargs -I {} touch {} | if [-z - ]; then echo "blank file"; fi;

Dies funktioniert nicht richtig und ich bin mir nicht sicher, warum nicht ... Also, wie kann ich den Wert von stdout-? - - richtig testen und als Bonus, wie kann ich den Inhalt von {}an die letzte Portion weitergeben? Zur Wirkung von:

cat list.txt | xargs -I {} touch {} | if [-z - ]; then echo "{} is a blank file"; fi;

Vielleicht sollte dies ein vollständiges Bash-Skript sein, aber ich würde es vorziehen, wenn ich dies in einer Zeile lernen könnte, da die Anwendungen dafür in vielerlei Hinsicht nützlich sein könnten -

Hier ist ein praktischeres Beispiel:

time john -incremental -stdout | grep 'clientsWeakPassword' | if [ ! -z - ]; then exit 0;

Dieses Skript generiert also zufällig Passwörter und stoppt, wenn das angegebene Passwort erreicht wird. Es zeigt an, wie lange es gedauert hat, dieses Passwort zu "knacken" ...

Und im Idealfall würde es auch so etwas wie "'clientsWeakPassword' brauchte XMinuten, um durch Zufallsraten zu knacken" ausgeben.

Diese Kette kann jedoch auch verwendet werden, um in Protokolldateien usw. usw. usw. nach einer bestimmten Sache zu suchen.

Ich hoffe auf jeden Fall, dass mich jemand in die richtige Richtung weisen kann.

Danke vielmals -

rm-vanda
quelle
1
Nur eine vorübergehende Bemerkung: Als jemand, der das Rechnen lernte, als 64 KB viel Speicher waren, habe ich Ineffizienz immer verabscheut. Es ist funktional nichts falsch daran cat list.txt | xargs ..., aber es sind ein oder mehrere Dateizugriffe erforderlich, um einen catanderen zu finden , um eine Pipe zu öffnen, und dann möglicherweise eine Gruppe von Seiten auszutauschen, um Speicherplatz catfreizugeben, und die gesamte Datei zu lesen, um sie zur Ausführung in den Speicher zu kopieren. und der Aufwand, den Prozess und die Pipe danach zu schließen und schließlich die Seiten, die catverschoben wurden, in den Speicher zurückzuspeichern .
AFH
1
Alles, was benötigt wird, ist die einzelne Datei zum Öffnen, Lesen und Schließen xargs <list.txt ....
AFH
Sehr gut zu wissen ... Ich habe Bash immer als Werkzeug und nicht als Skriptsprache verwendet und bin erst seit kurzem damit beschäftigt, fortgeschrittenere Dinge wie diese zu tun. Das ist genau die Art von Anleitung, nach der ich gesucht habe für - so ist diese Bemerkung ein Bonus-Tipp für mich - und ich bin dankbar ^ _ ^
rm-vanda
1
Danke fürs Zuhören. Ich sollte hinzufügen, dass es ungewöhnliche Umstände geben kann, wenn Sie dies wünschen cat list.txt | ..., um das Empfängerprogramm von Ihrer Eingabedatei zu isolieren. Und ich gehe davon aus, dass Effizienz keine Rolle spielt, wenn Sie einen einmaligen Befehl ausführen (obwohl in meinem Fall die Anzahl der Eingaben eine Rolle spielt!).
AFH
Vielen Dank für die Einweisung -! Aus irgendeinem Grund benutze ich das Caret nie in dieser Richtung - ich denke immer, cat something > some_filedass dies eine Gewohnheit ist, die ich abbrechen sollte, wenn ich mich im Bash verbessern möchte - also danke Du -!
RM-Vanda

Antworten:

1

Wenn Sie mehr als eine Sache machen wollen, erzeugen Sie eine Shell:

xargs -t sh -c '
    for f; do
        touch "$f"
        [ -s "$f" ] || echo "$f is zero size or does not exist" 
    done
' - < list.txt

Zu diesem Zeitpunkt können Sie jedoch auch eine while readSchleife anstelle von xargs verwenden.

Glenn Jackman
quelle
Großartig, danke, das ist genau das, wonach ich suche - ich habe es noch nie benutzt while read, also ist es genau das, was ich wissen muss ... Mein Beispiel war jedoch theoretisch und was ich wirklich brauche, ist es zu haben die stdoutin der if-Anweisung ... (Touch war offensichtlich eine schlechte Wahl, da es keine stdout ...)
RM-Vanda
ifselbst macht nichts mit stdout. Der folgende Befehl ifkönnte. Ich denke, Sie müssen Ihre Frage klarer formulieren, was Sie tatsächlich versuchen.
Glenn Jackman
Nun, ich denke, es gibt viele Anwendungen, um stdout an eine if-Anweisung zu übergeben, aber was mich ursprünglich dazu gebracht hat, war im Wesentlichen ein Proof of Concept, wie einfach es ist, WordPress-Passwörter zu knacken ... Wenn Sie es einem Client zeigen können Es dauert nur eine Zeile und Zeit, um ein Passwort zu knacken, dann hören sie zu. Leider habe ich über den "einzeiligen" Teil geblufft, aber da es dort 2/3 ist, dachte ich, dass es für das letzte Drittel sicherlich eine einfache Lösung gibt, die mir einfach nicht bewusst war ... Aber Sie haben es bestimmt gegeben mir die richtige Richtung, und ich werde sehr wahrscheinlich Ihre Antwort akzeptieren. Danke vielmals.
RM-Vanda