Próbowałem uzyskać listę wszystkich plików Pythona i HTML w katalogu z poleceniem find Documents -name "*.{py,html}"
.
Potem przyszła strona podręcznika:
Nawiasy klamrowe we wzorcu („{}”) nie są uważane za specjalne (tj. Znajdź. -Name 'foo {1,2}' pasuje do pliku o nazwie foo {1,2}, a nie do plików foo1 i foo2.
Ponieważ jest to część łańcucha potoków, chciałbym móc określić, które rozszerzenia pasują w czasie wykonywania (bez kodowania). Jeśli find po prostu nie może tego zrobić, perl-one-liner (lub podobny) byłby w porządku.
Edycja: Odpowiedź, którą w końcu wymyśliłem, obejmuje różnego rodzaju badziewie i jest również trochę długa, więc opublikowałem ją jako odpowiedź na pierwotny świąd, który próbowałem podrapać. Jeśli masz lepsze rozwiązania, możesz je zhakować.
locate
jednak, z zastrzeżeniem, że wewnętrzna aktualizacja może nie być aktualna. Ale to jest szybkie.Odpowiedzi:
Użyj
-o
, co oznacza „lub”:Trzeba by zbudować ten wiersz poleceń programowo, co nie jest takie łatwe.
Czy używasz bash (lub Cygwin w systemie Windows)? Jeśli tak, powinieneś być w stanie to zrobić:
który może być łatwiejszy do zbudowania programowo.
źródło
**
wyszukiwanie rekurencyjne; Bash obsługuje go tylko w wersjach 4.0 i nowszych, i tylko zshopt -s globstar
.-name
użyć dwóch nawiasów klamrowych, jeśli używasz-exec
. Np.find Documents \( -name "*.py" -o -name "*.html" \) -exec file {} \;
-print0
do obsługi nazw plików ze spacjami.Niektóre edycje find, głównie w systemach Linux, prawdopodobnie w innych również obsługują opcje -regex i -regextype, które wyszukują pliki o nazwach pasujących do wyrażenia regularnego.
na przykład
powinien zrobić lewę w powyższym przykładzie. Nie jest to jednak standardowa funkcja wyszukiwania POSIX i zależy od implementacji.
źródło
find . -regex ".*\.\(py\|html\)$"
działa, ponieważ domyślnie znajdują się wyrażenia regularne w stylu Emacsa, które są nieco inne, więc nie trzeba określać typu wyrażenia regularnego.-regextype posix-egrep
jest to przydatne (w przeciwnym razie musisz uciec od wielu znaków). Jest to polecenie find, którego użyłem do zakończenia dystrybucji budowania pliku ZIP dystrybucji systemu Windows (wyszukuje pliki do zmiany, a plik zmienia je w dos-eol):find -regextype posix-egrep -regex ".*(\.([chyl]|def|cpy|cob|conf|cfg)|(README|ChangeLog|AUTHORS|ABOUT-NLS|NEWS|THANKS|TODO|COPYING.*))$" -exec sed -i -e 's/\r*$/\r/' {} \;
Możesz programowo dodać więcej
-name
klauzul, oddzielonych-or
:Lub przejdź do prostej pętli zamiast:
źródło
*.py
plików, albo masz dziwną wersjęfind
. Polecenie wymienione powyżej działa dobrze.-iname
. Zwraca*.py
pliki tylko wtedy, gdy zapisze je w ostatniej pozycji (podobnieiname *.html
jak pierwsze wyrażenie) . Używam polecenia w Debianie.To znajdzie wszystkie pliki .c lub .cpp w systemie Linux
Nie potrzebujesz uciekającego się nawiasu, chyba że wykonasz dodatkowe mody. Tutaj ze strony podręcznika mówią, że jeśli wzór pasuje, wydrukuj go. Być może próbują kontrolować drukowanie. W tym przypadku -print działa jako warunek i staje się warunkiem „AND”. Zapobiegnie to drukowaniu plików .c.
Ale jeśli podoba ci się oryginalna odpowiedź, możesz kontrolować drukowanie. To również znajdzie wszystkie pliki .c.
Ostatni przykład dla wszystkich plików źródłowych c / c ++
źródło
Miałem podobną potrzebę. To działało dla mnie:
źródło
()
find -name "*.cpp" -o -name "*.c" -o -name "*.cc" -print0
musiałem użyć pary parenów, aby zgrupuj drugiego lub operatora.find -name "*.cpp" -o \( -name "*.c" -o -name "*.cc" \) -print0
Możliwe, że -print0, które zawsze jest „prawdziwe”, wpłynęło na logikę.Moje domyślne to:
find -type f | egrep -i "*.java|*.css|*.cs|*.sql"
Podobnie jak w przypadku mniej intencjonalnego
find
wykonania przez Brendana Longa i Stephana202 i in .:źródło
egrep
wyrażenia regularnego, zamiast tego masz glob powłoki, w którym należy użyć wyrażenia regularnego. (Typowefind
użycie to:find {directory} [options...] [action]
gdzie, w zależności od impl,directory
domyślnie może.
iaction
domyślnie jest-print
, ale będę jawny.) Zamiast tego użyj czegoś takiego:find . -type f -print | egrep -i '\.java$|\.css$|\.cs$|\.sql$'
Ale również, jako naprawdę szybka alternatywafind
, można również spróbujlocate
w podobny sposób (choć niekoniecznie aktualny, ponieważ wysyła zapytanie do wewnętrznej bazy danych o listę plików)proste, ale działa :)
źródło
Musiałem usunąć wszystkie pliki z katalogów potomnych, z wyjątkiem niektórych plików. Dla mnie działały następujące (określone trzy wzory):
źródło
Nawiasy klamrowe w obrębie wzorca
\(\)
są wymagane dla wzorca nazwy zor
Chociaż wzorzec nazwy z
and
operatorem nie jest wymaganyźródło
Działa to na powłoce Korn AIX.
To szuka
*.cbl
lub*.dms
które mają 1 dzień, tylko w bieżącym katalogu, pomijając podkatalogi.źródło
źródło
Co powiesz na
Zawiera listę wszystkich plików z końcówkami .py lub .html w nazwach plików
źródło