Ich möchte alle Dateien finden, die mir nicht gehören (d. h., die ich nicht ändern darf). Ich habe versucht
find . -exec if [[ ! -O {} ]]; then echo {}; fi ;
-exec
Aber wenn ich den gesamten Befehl in Anführungszeichen setze , etwa so:
find . -exec 'if [[ ! -O {} ]]; then echo {}; fi' \;
Beides funktioniert nicht, da der Verweis auf die aktuelle Datei {}
in Anführungszeichen steht und daher nicht auf die Datei erweitert wird.
Das Problem ist, dass ich nicht weiß, wie ich die {}
aktuelle Datei komplexer einbetten kann -exec
als beispielsweise einfach find . -exec grep smf {} \;
(das {}
nur einmal verwendet wird). Wie verwende ich -exec
die Option in „Find“ in Befehlen, in denen Sie mehr als einmal auf die aktuelle Datei verweisen? (Das dauert {}
länger).
Antwort1
Ihr Code funktioniert nicht, da das Dienstprogramm, das Sie find
ausführen möchten, if
nicht existiert (es handelt sich um ein Schlüsselwort in der Shell-Syntax).
Der -O
Test ist wahr, wenn das Argument eine Datei ist, die dem aktuellen Benutzer gehört. Derselbe Test kann auch find
mit folgendem durchgeführt werden -user "$USER"
(unter der Annahme, dass $USER
er auf den aktuellen Benutzer erweitert wird):
find . -type f ! -user "$USER"
Sie können auch Folgendes verwenden test -O
, wenn Ihr externes test
Dienstprogramm diesen nicht standardmäßigen Test unterstützt (prüfen Sie man test
):
find . -type f ! -exec test -O {} \; -print
-O
Wenn Sie den in die Shell integrierten Test dennoch verwenden möchten oder müssen bash
, müssen Sie eine bash
Shell starten, um den Test durchzuführen:
find . -type f -exec bash -c '[[ ! -O "$1" ]]' bash {} \; -print
Dies startet ein Inline- bash -c
Skript für jede gefundene Datei, das den Test für ihr erstes Argument ( $1
) ausführt. Das Argument wird in der Befehlszeile des Skripts übergeben find
(die bash
Zeichenfolge davor {}
wird in $0
das Skript eingefügt und von dieser Shell für Fehlermeldungen verwendet). Wenn der Test wahr ist (die Datei gehört nicht Ihnen), -print
wird es wirksam und gibt den Pfadnamen der Datei aus.
Etwas effizienter geht das mit
find . -type f -exec bash -c '
for pathname do
[[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
done' bash {} +
Dies ist effizienter, da Stapel der gefundenen Pfadnamen an das bash -c
Skript übergeben werden.
... aber die Verwendung -user "$USER"
wäre die bessere Option.
Siehe auch: