Wyklucz ukryte pliki podczas wyszukiwania przy pomocy Unix / Linux find?

35

Z jakimi opcjami muszę korzystać, findaby wykluczyć ukryte pliki?

stamtąd
źródło
4
Poza tym: powodem, dla którego nie ma specjalnego wsparcia dla tego zadania, jest to, że jedyną specjalną cechą plików nazwanych z wiodącym „.” jest to, że nie ma ich na liście, lschyba że wyraźnie o to poproszono: są to całkowicie zwykłe pliki pod każdym względem, tylko lsdomyślnie pozwala je zignorować.
dmckee
2
Pytanie: czy chcesz coś ukryć .hidden/visible.txt?
Keith Thompson

Odpowiedzi:

14

Znalazłem to tutaj :

find . \( ! -regex '.*/\..*' \) -type f -name "whatever"
Jarvin
źródło
Dlaczego nie tylko \( ! -name '.*' \)?
grawity
@grawity Właśnie to odkryłem, nie wiem do końca, jak to działa. Czy twój nie tylko ukryłby ukryte pliki, ale ukryte katalogi oraz całą ich zawartość podrzędną i ukryte pliki w podfolderach?
Jarvin
5
Nie, to by nie: / Ale \( ! -path '*/.*' \)by.
grawity
@grawity Tak, przypuszczam, że założyłem, czego chciał OP… Rozwiązanie dla twojej nazwy jest prawdopodobnie najbliższe temu, o co prosili.
Jarvin
@ grawity & Dan: Czy to nie (! -path '^. *') ?? twoje rozwiązania zignorują każdy plik, który ma „.” gdziekolwiek w nazwie pliku, np. a.exe, b.out itp ...
Software Mechanic
13

Wygląda na to, że globalny wzór negacji nie jest dobrze znany. Możesz więc użyć:

find . -name "[!.]*"
czerwona kropka
źródło
12

To nie odpowiada na twoje pytanie, ale dla zadania znajdowania nie ukrytych plików chcę pozwolić znaleźć wszystkie pliki, a następnie filtrować za pomocą grep.

find . -type f | grep -v '/\.'

Podobne do twojego podejścia, ale może nieco prostsze.

Simon Chiang
źródło
To był jedyny z tych wkładek, który dla mnie działał.
entpnerd
7

Wypróbuj następujące findużycie:

find . -type f -not -path '*/\.*'

Co zignoruje wszystkie ukryte pliki (pliki i katalogi zaczynające się od kropki).

kenorb
źródło
1

Napisałem skrypt o nazwie, findnhktóry moim zdaniem lepiej radzi sobie z niektórymi przypadkami krawędziowymi niż odpowiedzi na to pytanie, które udało mi się znaleźć w Internecie.

#!/bin/bash

declare -a paths

while [ $# -ne 0 ]; do
  case "$1" in -*) break ;; esac
  paths+=("$1")
  shift
done

find "${paths[@]}" \( -name . -o -name .. -o \! \( -name '.*' -prune \) \) "$@"

Na przykład, możesz znaleźć nie ukryte pliki i katalogi w wyraźnie określonym ukrytym katalogu za pomocą polecenia podobnego findnh ~/.hiddendir/, które pokaże, ~/.hiddendir/fileale nie ~/.hiddendir/.superhiddenfile.

Kurt Glastetter
źródło
1
Niezły kod. Tyle że kiedy próbuję findnh ~/.hiddendir/, nic nie dostaję. Poza tym, czym to się różni od ! -path '*/.*'i find … | grep -v '/\.'?
G-Man mówi „Przywróć Monikę”
1

Jeśli Twoim celem jest findi grep, ripgrepdomyślnie wyklucza ukryte pliki, np

rg --files

--files Wydrukuj każdy plik, który będzie przeszukiwany, bez faktycznego wyszukiwania.

kenorb
źródło
1

fd

Użyj fdprostej, znacznie szybszej i przyjaznej dla użytkownika alternatywy dla find. Domyślnie:

  • Domyślnie ignoruje ukryte katalogi i pliki.
  • .gitignoreDomyślnie ignoruje wzorce z twojego .

Sprawdź analizę testu porównawczego .

kenorb
źródło
1

Aby znaleźć ukryte pliki:

find -name '[.]*'

Aby znaleźć widoczne pliki:

find -name '[!.]*'

To takie proste.

Carmin
źródło