Wie ersetzt man in find -exec die aktuelle Datei durch {}?

Wie ersetzt man in find -exec die aktuelle Datei durch {}?

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 ;

-execAber 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 -execals beispielsweise einfach find . -exec grep smf {} \;(das {}nur einmal verwendet wird). Wie verwende ich -execdie 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 findausführen möchten, ifnicht existiert (es handelt sich um ein Schlüsselwort in der Shell-Syntax).

Der -OTest ist wahr, wenn das Argument eine Datei ist, die dem aktuellen Benutzer gehört. Derselbe Test kann auch findmit folgendem durchgeführt werden -user "$USER"(unter der Annahme, dass $USERer auf den aktuellen Benutzer erweitert wird):

find . -type f ! -user "$USER"

Sie können auch Folgendes verwenden test -O, wenn Ihr externes testDienstprogramm diesen nicht standardmäßigen Test unterstützt (prüfen Sie man test):

find . -type f ! -exec test -O {} \; -print

-OWenn Sie den in die Shell integrierten Test dennoch verwenden möchten oder müssen bash, müssen Sie eine bashShell starten, um den Test durchzuführen:

find . -type f -exec bash -c '[[ ! -O "$1" ]]' bash {} \; -print

Dies startet ein Inline- bash -cSkript 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 bashZeichenfolge davor {}wird in $0das Skript eingefügt und von dieser Shell für Fehlermeldungen verwendet). Wenn der Test wahr ist (die Datei gehört nicht Ihnen), -printwird 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 -cSkript übergeben werden.

... aber die Verwendung -user "$USER"wäre die bessere Option.

Siehe auch:

verwandte Informationen