Ausschließen von . und .. aus Ergebnissen in find und ls

Ausschließen von . und .. aus Ergebnissen in find und ls

Gibt es eine Möglichkeit, zu verhindern, dass und findin ihren Ergebnissen ls -laufgelistet werden ? Mir ist es egal, ob dieses Ergebnis in der Ausgabe angezeigt wird, und es hindert mich daran, ihre Ausgabe effektiv an weiterzuleiten, um die Dinge genau zu zählen....wc -l

Falls es wichtig ist, ich arbeite in zsh.

Antwort1

lsVerwenden Sie für -Aanstelle von -a.

aus man ls:

   -A, --almost-all
          do not list implied . and ..

Antwort2

Mit zsh:

count() echo $#
count *        # non-hidden files (all types)
count *(D)     # files (all types)
count **/*(D)  # files recursively (all types)
count **/*(D/)  # directories only (recursively)

( zshGlobs schließen niemals . ein ., auch ..nicht wenn . dotglobaktiviert ist (wie beim (D)Globbing-Qualifizierer)).

Um eine Fehlermeldung zu vermeiden, wenn keine Datei vorhanden ist, fügen Sie den NGlobbing-Qualifizierer hinzu:

count *(ND)

Dies führt dazu, dass der Glob auf nichts erweitert wird (kein Argument, kein leeres Argument), wenn keine Übereinstimmung vorhanden ist.

Beachten Sie, dass das Zeilenumbruchzeichen ein genauso gültiges Zeichen wie jedes andere Zeichen in einem Dateinamen ist. Daher ist die Weiterleitung der Ausgabe von lsoder findan wc -lnicht korrekt.

POSIX: Sie könnten die /Zeichen anstelle der Zeilenumbruchzeichen zählen:

find . ! -name . -prune -print | grep -c /

Oder rekursiv mit diesem Trick:

find .//. ! -name . -prune -print | grep -c //

Antwort3

Um finddie Punktverzeichnisse auszuschließen, können Sie Folgendes verwenden:

$ find . ! -path . -type d

Beispiel

$ find . ! -path . -type d | head -5
./.vim_SO
./.vim_SO/bundle
./.vim_SO/bundle/vim-fugitive
./.vim_SO/bundle/vim-fugitive/plugin
./.vim_SO/bundle/vim-fugitive/doc
...

verwandte Informationen