Począwszy od (zwróć uwagę na symbole wieloznaczne przed i po „pewnym tekście”)
find . -type f -name '*some text*'
jak można wykluczyć / zignorować wszystkie ukryte pliki i katalogi?
Już zbyt długo googlowałem, natknąłem się na trochę - śliwki i! (wykrzyknik) parametry, ale brak pasującego (i oszczędnego) przykładu, który właśnie działał .
Piping |
do grep
byłby opcją i chętnie przyjmę też przykłady; ale przede wszystkim jestem zainteresowany krótkim jedną wkładką (lub kilku autonomicznych jednej wkładki, ilustrujących różne sposoby osiągnięcia tego samego celu w wierszu polecenia) tylko przy użyciu find
.
ps: znajdowanie plików w systemie Linux i wykluczanie określonych katalogów wydaje się blisko powiązane, ale a) nie jest jeszcze akceptowane i b) jest powiązane, ale różne i różne, ale c) może dostarczyć inspiracji i pomóc w ustaleniu zamieszania!
Edytować
find . \( ! -regex '.*/\..*' \) -type f -name "whatever"
, Pracuje. Wyrażenie regularne szuka „wszystkiego, potem ukośnika, następnie kropki, a następnie wszystkiego” (tj. Wszystkich ukrytych plików i folderów, w tym ich podfolderów) oraz „!” neguje regex.
źródło
Odpowiedzi:
Spowoduje to wydrukowanie wszystkich plików, które są potomkami twojego katalogu, pomijając ukryte pliki i katalogi:
Więc jeśli szukasz pliku z
some text
jego nazwą i chcesz pominąć ukryte pliki i katalogi, uruchom:Wyjaśnienie:
-path
Opcja uruchamia sprawdza wzór przeciwko cały ciąg ścieżki.*
jest symbolem wieloznacznym,/
jest separatorem katalogu,\.
jest kropką (musi być poprzedzony znakiem specjalnym, aby uniknąć specjalnego znaczenia) i*
jest kolejnym znakiem wieloznacznym.-not
oznacza, że nie wybieraj plików pasujących do tego testu.Nie sądzę, aby było
find
to wystarczająco inteligentne, aby uniknąć rekurencyjnego przeszukiwania ukrytych katalogów w poprzednim poleceniu, więc jeśli potrzebujesz prędkości, użyj-prune
zamiast tego:źródło
-print
na końcu potrzebujesz tego na końcu! Również nie jestem pewien, czy-name '\.*' would be more efficient instead of
-path` (ponieważ ścieżka szuka podścieżek, ale zostaną one przycięte).
w tym kontekście?find
oznacza bieżący katalog:find
obejrzy wszystkie pliki i katalogi w bieżącym katalogu. Argument popath
jest wyrażeniem regularnym, w którym kropka zwykle oznacza „dowolny znak”, aby oznaczać dosłowną kropkę, musimy uciec przed nią odwrotnym ukośnikiem. Argument po-name
nie jest wyrażenie regularne, ale rozszerza symbole wieloznaczne jak?
i*
jak pocisk robi..
mając specjalne znaczenie..
. O ile mi wiadomo, tylko te muszą być uciekł:*
,?
, i[]
.Jest to jeden z niewielu sposobów wykluczania plików kropek, który działa również poprawnie w systemach BSD, Mac i Linux:
$PWD
wydrukuj pełną ścieżkę do bieżącego katalogu, aby ścieżka nie zaczynała się od./
-name ".*" -prune
dopasowuje wszystkie pliki lub katalogi, które zaczynają się od kropki, a następnie nie schodzą-o -print
oznacza wydrukować nazwę pliku, jeśli poprzednie wyrażenie nic nie pasowało. Używanie-print
lub-print0
powoduje, że wszystkie inne wyrażenia nie są drukowane domyślnie.źródło
-o ... -print
jest pomocny. Do mojego użytku mam terazfind ... '!' -name . -name '.*' -prune -o ... -print
, co było wygodniejsze niż włączenie $ PWD.Nie obejmuje wszystkich ukrytych katalogów i ukrytych plików w katalogu $ DIR
źródło
Odpowiedź I pierwotnie opublikowany jako „edit” do mojego pierwotnego pytania powyżej:
find . \( ! -regex '.*/\..*' \) -type f -name "whatever"
, Pracuje. Wyrażenie regularne szuka „wszystkiego, potem ukośnika, następnie kropki, a następnie wszystkiego” (tj. Wszystkich ukrytych plików i folderów, w tym ich podfolderów) oraz „!” neguje regex.źródło
find . \( ! -regex './\..*' \) -type f -maxdepth 1 -print
Nie musisz do tego używać
find
. Wystarczy użyć globstar w powłoce samodzielnie, na przykład:lub:
gdzie
**/
reprezentuje dowolny folder rekurencyjnie i*foo*
każdy plik, który mafoo
w swojej nazwie.Domyślnie użycie
ls
spowoduje wydrukowanie nazw plików z wyłączeniem ukrytych plików i katalogów.Jeśli nie masz włączonego globowania, zrób to
shopt -s globstar
.Uwaga: Nowa opcja globowania działa w powłokach Bash 4, zsh i podobnych.
Przykład:
źródło
ls
tego!echo **/*foo*
/
oznacza folder, oddziela katalogi od nazwy pliku.*
w zasadzie reprezentuje wszystko.@ Flimm za odpowiedź jest dobra, szczególnie dlatego, że zapobiega znaleźć z malejącym do ukrytych katalogów . Wolę to uproszczenie:
Ogólnie, aby wykluczyć wszystkie ukryte ścieżki (zwykłe pliki, katalogi itp.):
Na przykład, używając katalogu roboczego jako punktu początkowego i
-name '*some text*'
jako wyrażenia:W przeciwieństwie do tego, co sugeruje odpowiedź @ Flimm, brak ukrytych plików lub ukrytych katalogów to prosty przypadek.
-path '*/.*'
Wyrażenie jest prawdziwe dla każdej ścieżki (zwykłych plików, katalogów, itp), który ma.
natychmiast po separatorze plików/
. Ta linia przycina zarówno ukryte pliki, jak i katalogi.Zezwalanie na ukryte pliki, z wyłączeniem ukrytych katalogów, wymaga dalszego filtrowania. W tym miejscu należy
-type d
uwzględnić przycinane wyrażenie.Na przykład:
W tym przypadku
-type d -path '*/.*'
dotyczytrue
tylko katalogów, dlatego przycinane są tylko katalogi.źródło
find
ma zgrabne przełączniki logiczne, takie jak,-and
i-not
możesz użyć ich na swoją korzyść, aby znaleźć pasujący plik z dwiema podobnymi regułami:Jak widać,
find
wykorzystuje dwie reguły-name '*hidden_file*'
i-and \( -not -name ".*" \)
znajduje te nazwy plików, które pasują do obu warunków - nazwa pliku zhidden_file
nim, ale bez kropki. Zwróć uwagę na ukośniki przed nawiasami - służą one do zdefiniowania nawiasów jakofind
argumentów raczej definiujących podpowłokę (co inaczej nawiasy oznaczają bez ukośników)źródło
Uwagi:
.
: bieżący folder-maxdepth 1
aby wyszukać rekurencyjnie-type f
: znajdź pliki, a nie katalogi (d
)-not -path '*/\.*'
: nie wracaj.hidden_files
sed 's/^\.\///g'
: usuń poprzedni./
z listy wynikówźródło