943 Stimmen

Wie kann ich alle "Zugriff verweigert" Nachrichten von "find" ausschließen?

Ich muss alle Zugriff verweigert Nachrichten ausblenden von:

find . > files_and_folders

Ich experimentiere, wenn solche Nachrichten auftreten. Ich muss alle Ordner und Dateien sammeln, bei denen es nicht auftritt.

Ist es möglich, die Berechtigungsebenen auf die files_and_folders Datei umzuleiten?

Wie kann ich gleichzeitig die Fehler ausblenden?

0 Stimmen

Tolle Frage! Leider funktionieren die ersten drei Antworten einfach nicht unter Debian Linux. Oder zumindest meine Konfiguration davon. Ich brauchte Fatih's Lösung, find /. -name 'toBeSearched.file' 2>/dev/null.

0 Stimmen

Ich fand es am besten, den /proc-Pfad mithilfe der -path-Option auszuschließen. Es hilft, die -prune-Option zu verneinen, um das Drucken von ausgeblendeten Elementen zu vermeiden.

2voto

Leonardo Hermoso Punkte 836

Sie können das grep -v Invert-Match verwenden

-v, --invert-match        wählt nicht übereinstimmende Zeilen aus

beispielsweise so:

find . > Dateien_und_Ordner
cat Dateien_und_Ordner | grep -v "Zugriff verweigert" > Dateien_und_Ordner

Sollte das Magische tun

2voto

Jan aka uptech Punkte 1039

-=Für MacOS=-

Erstellen Sie einen neuen Befehl mit dem Alias: Fügen Sie einfach in ~/.bash_profile die Zeile hinzu:

alias search='find / -name $file 2>/dev/null'

und in einem neuen Terminalfenster können Sie ihn aufrufen:

$ file=; search

zum Beispiel:

$ file=etc; search

2voto

Kayle Sawyer Punkte 519

Wenn Sie CSH oder TCSH verwenden, hier ist eine Lösung:

( find . > files_and_folders ) >& /dev/null

Wenn Sie die Ausgabe auf dem Terminal möchten:

( find . > /dev/tty ) >& /dev/null

Allerdings sollten Sie gemäß dem "csh-whynot" FAQ CSH nicht verwenden.

0 Stimmen

Ich möchte alle txt-Dateien suchen und versteckte Dateien/Verzeichnisse ausschließen, die Meldung "Berechtigung verweigert" soll nicht gedruckt werden. Ich benutze die Csh-Shell. Ich habe die folgenden Befehle verwendet, und sie funktionieren nicht. find . -type f -iname ".txt" -not -path '*/\.' | egrep -v "Permission denied" find . -type f -iname ".txt" -not -path '*/\.' 2>/dev/null Folgender Fehler tritt auf. find: Pfade müssen vor Ausdruck stehen: 2 Verwendung: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [Pfad...] [Ausdruck]

1voto

leogama Punkte 394

Optimierte Lösungen für GNU find

Zumindest für einige System+Dateisystem-Kombinationen muss find nicht stat auf eine Datei anwenden, um deren Typ zu ermitteln. Dann können Sie überprüfen, ob es sich um ein Verzeichnis handelt, bevor Sie die Lesbarkeit testen, um die Suche zu beschleunigen‡ - Ich habe bei Tests, die ich durchgeführt habe, etwa 30% Verbesserung erzielt. Daher sollten Sie bei langen Suchen oder Suchen, die häufig genug ausgeführt werden, eine dieser Methoden verwenden:

Alles Sichtbare ausgeben

$ find . -print -type d ! -readable -prune
$ find . -type d ! -readable -prune , [expression] -print

Sichtbare Dateien ausgeben

$ find . -type d \( ! -readable -prune -o -true \) -o [expression] -print

Nur sichtbare Verzeichnisse ausgeben

$ find . -type d -print ! -readable -prune
$ find . -type d \( ! -readable -prune , [expression] -print \)

Nur lesbare Verzeichnisse ausgeben

$ find . -type d ! -readable -prune -o [expression] -print

Notizen

† Die Operatoren -readable und , (Komma) sind GNU-Erweiterungen. Dieser Ausdruck

$ find . [expression] , [expression]

ist logisch äquivalent zu

$ find . \( [expression] -o -true \) [expression]

‡ Dies liegt daran, dass find-Implementierungen mit dieser aktivierten Optimierung im besprochenen Anwendungsfall das staten von Nicht-Verzeichnisdateien vollständig vermeiden werden.


Bearbeitung: Shell-Funktion

Hier ist eine POSIX-Shell-Funktion, die ich entwickelt habe, um diesen Test jeder Ausdruck voranzustellen. Es scheint gut zu funktionieren mit dem impliziten -print und den Kommandozeilenoptionen:

findr () {
    j=$#; done=
    while [ $j -gt 0 ]; do
        j=$(($j - 1))
        arg="$1"; shift
        test "$done" || case "$arg" in
            -[A-Z]*) ;;  # Optionen überspringen
            -*|\(|!)     # Anfang des Ausdrucks finden
                set -- "$@" \( -type d ! -readable -prune -o -true \)
                done=true
                ;;
        esac
        set -- "$@" "$arg"
    done
    find "$@"
}

Die anderen beiden in den Antworten aufgeführten Alternativen verursachten entweder einen Syntaxfehler in der POSIX-Shell (konnte nicht einmal eine Datei mit der Funktionsdefinition einbinden) oder eine falsche Ausgabe in ZSH ... Die Laufzeit scheint gleichwertig zu sein.

0voto

Charlie Reitzel Punkte 644

Um das gesamte Dateisystem nach einer bestimmten Datei zu durchsuchen, z.B. hosts, außer dem /proc-Verzeichnis, das alle Arten von Fehlern verursacht, verwende ich Folgendes:

# find / -path /proc ! -prune -o -name hosts -type f
/etc/hosts

Hinweis: Weil -prune immer wahr ist, muss man es negieren, um zu verhindern, dass man die Zeile /proc im Output sieht. Ich habe versucht, den Ansatz mit ! -readable zu verwenden und festgestellt, dass er alle möglichen Dinge unter /proc zurückgibt, die der aktuelle Benutzer lesen kann. Also funktioniert die "ODER" -Bedingung in dem Fall nicht so, wie man es erwartet/braucht.

Ich habe mit dem Beispiel begonnen, das auf der find-Manpage gegeben wurde. Siehe die -prune Option.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X