Ich versuche, find -exec mit mehreren Befehlen ohne Erfolg zu verwenden. Weiß jemand, ob Befehle wie die folgenden möglich sind?
find *.txt -exec echo "$(tail -1 '{}'),$(ls '{}')" \;
Grundsätzlich versuche ich, die letzte Zeile jeder txt-Datei im aktuellen Verzeichnis zu drucken und am Ende der Zeile ein Komma gefolgt vom Dateinamen zu drucken.
find
Handbuchseite:There are unavoidable security problems surrounding use of the -exec option; you should use the -execdir option instead.
unixhelp.ed.ac.uk/CGI/man-cgi?findAntworten:
find
akzeptiert mehrere-exec
Teile des Befehls. Zum Beispiel:Beachten Sie, dass in diesem Fall der zweite Befehl nur ausgeführt wird, wenn der erste erfolgreich zurückgegeben wird, wie von @Caleb erwähnt. Wenn beide Befehle unabhängig von Erfolg oder Misserfolg ausgeführt werden sollen, können Sie dieses Konstrukt verwenden:
quelle
-n
in einigen anderen Antworten, um die durch Echo erzeugte neue Zeile zu unterdrücken. Dies ist praktisch, wenn Ihr zweiter Befehl nur eine Ausgabezeile erzeugt und Sie möchten, dass sie leichter zu lesen sind.quelle
... -exec bash -c ...
anstelle von verwenden... -exec sh -c ...
.{}
in Shell-Code einbetten . Siehe unix.stackexchange.com/questions/156008/...Einer der folgenden:
quelle
$0
. Versuchen Sie dies mit "foobar" anstelle von "_":find /usr/bin -name find -exec sh -c 'echo "[$0] [$1]"' foobar {} \;
- der Ausgabe: "[foobar] [/ usr / bin / find]".$0
ist normalerweise der Programmname (ARGV[0]
).sh -c
in einfachen Anführungszeichen und nicht in doppelten Anführungszeichen steht. Ansonsten$1
ist im falschen Bereich.'$1'
mit doppelten Anführungszeichen schreiben, solange Sie der Variablen ("\$1"
) entkommen . Sie können auch anderen Zeichen entkommen ("\""
).Ein anderer Weg ist wie folgt:
in einer Zeile
multiple_cmd()
" - ist eine Funktionexport -f multiple_cmd
" - exportiert es, damit jede andere Subshell es sehen kannfind *.txt -exec bash -c 'multiple_cmd "$0"' {} \;
" - finde, dass die Funktion in deinem Beispiel ausgeführt wirdAuf diese Weise kann multiple_cmd so lang und komplex sein, wie Sie es benötigen.
Hoffe das hilft.
quelle
~/aaa$ acmd() { echo x \"$1\" x; }; export -f acmd; find . -exec bash -c 'acmd {}' \;
Es gibt einen einfacheren Weg:
Alternative:
quelle
zcat $file | wc -l
"; erledigt funktioniert, also danke!`
, um Backslashes wie folgt zu verwenden:\`
( Dies ist jedoch ein weiterer guter Grund,$()
stattdessen zu verwenden ).Ich weiß nicht, ob Sie dies mit find tun können, aber eine alternative Lösung wäre, ein Shell-Skript zu erstellen und dies mit find auszuführen.
lastline.sh:
Machen Sie das Skript ausführbar
Verwendung
find
:quelle
Die erste Antwort von Denis ist die Antwort, um das Problem zu lösen. Tatsächlich ist es jedoch kein Fund mehr mit mehreren Befehlen in nur einer Ausführung, wie der Titel vermuten lässt. Um den einen Exec mit mehreren Befehlen zu beantworten, müssen wir nach etwas anderem suchen, um es zu lösen. Hier ist ein Beispiel:
Behalten Sie die letzten 10000 Zeilen von .log-Dateien bei, die in den letzten 7 Tagen mit 1 exec-Befehl unter Verwendung mehrerer {} Verweise geändert wurden
1) Sehen Sie, was der Befehl für welche Dateien tun wird:
2) Mach es: (notiere nicht mehr "\>" sondern nur ">" dies ist erwünscht)
find / -name "*.log" -a -type f -a -mtime -7 -exec sh -c "tail -10000 {} > fictmp; cat fictmp > {} ; rm fictmp" \;
quelle
Dank Camilo Martin konnte ich eine verwandte Frage beantworten:
Was ich tun wollte war
was nicht funktioniert hat. Jedoch,
funktioniert, also danke!
quelle
Erweiterung der Antwort von @ Tinker,
In meinem Fall musste ich ein
command | command | command
Inside-exec
erstellen, um sowohl den Dateinamen als auch den gefundenen Text in Dateien zu drucken, die einen bestimmten Text enthalten.Ich konnte es tun mit:
Das Ergebnis ist:
quelle
/dev/null
als zweites Argumentgrep
mit einem-exec
Parameter an den Befehl übergeben :find . -name config -type f -exec grep "bitbucket" {} /dev/null \;
sollte xargs verwenden :)
ein anderer (arbeitet an osx)
quelle
find
Situationen, in denen die Anzahl der übereinstimmenden Dateien für eine Befehlszeile zu groß ist.-exec
ist ein Weg, um diese Grenze zu umgehen. Bei der Weiterleitung an ein Versorgungsunternehmen fehlt dieser Vorteil.xargs -n
existiert, um die Anzahl der Übereinstimmungen pro Aufruf zu wählen.xargs -n 1 foocmd
wirdfoocmd {}
für jedes Spiel ausgeführt.Eine
find+xargs
Antwort.Im folgenden Beispiel werden alle
.html
Dateien gefunden und eine Kopie mit der.BAK
angehängten Erweiterung (z . B.1.html
>1.html.BAK
) erstellt.Einzelner Befehl mit mehreren Platzhaltern
Mehrere Befehle mit mehreren Platzhaltern
Dieser Befehl wird auch die Arbeit mit Dateien , die mit einem Bindestrich oder Leerzeichen enthalten , wie beispielsweise starten
-my file.html
dank Parameter unter Angabe und die--
nachcp
dem Signal zucp
Ende Parameter und der Beginn der eigentlichen Dateinamen.quelle