2008-11-10 8 views

Odpowiedz

35
find . -name \*.h -print -o -name \*.cpp -print 

lub

find . \(-name \*.h -o -name \*.cpp \) -print 
+0

Czy coś zmieniło się z 'find' w ciągu ostatnich kilku lat? Nie mogę uruchomić tego w Ubuntu 9.10 lub OS X 10.6. Znajduje pliki '.cpp', ale nie pliki' .h'. Przykład: https://gist.github.com/783687 – Nate

+1

Spróbuj 'find. -name \ *. h -print -o -name \ *. cpp -print' –

+0

To działa. Dzięki. – Nate

9
find -name "*.h" -or -name "*.cpp" 

(edytowany chronić gwiazdki, które zostały zinterpretowane jako formatowania)

+0

Powoduje to tylko przesyłanie plików o nazwach dokładnie ".h" lub ".cpp". Wymagana jest wieloznacznik: find -name "* .h" -or -name "* .cpp" – lmop

+4

'-or' jest GNUism. Ale '-o' jest standardem (POSIX). – Jens

6

Paul Tomblin już dostarczył wspaniały odpowiedź, ale myślałem, że widziałem wzór w co robiłeś.

Szanse są będziesz używać znaleźć wygenerować listę plików do przetworzenia z grep jeden dzień, a dla takiego zadania istnieje znacznie bardziej przyjazne dla użytkownika narzędzie, Ack

działa na każdym systemie, który obsługuje Perl, i przeszukiwania wszystkich C++ powiązanych plików w katalogu rekurencyjnie za dany ciąg jest tak proste jak

ack "int\s+foo" --cpp 

"--cpp" domyślnie mecze .cpp .cc .cxx .m .hpp .hh .h .hxx plików

(również pomija repozytorium katalogi domyślnie więc przyzwyczajenie pasuje na plikach, które zdarzają się wyglądać w nich plików.)

2
find . -regex ".*\.[cChH]\(pp\)?" -print 

Ten testowany w porządku dla mnie w Cygwin.

+0

To również znajdzie pliki z rozszerzeniem 'c',' Cpp', 'Hpp', które nie są plikami cPP ani zwykłymi rozszerzeniami.Ponadto, nie uniknąłeś poprawnie ostatniej kropki, co oznacza, że ​​będziesz także miał pliki matematyczne o nazwach np. 'xcpp' lub' .C'. Wprowadziłeś kilka problemów, nie opanowując wyrażeń regularnych i nie znalazłeś właściwego. –

+0

@Lyle, twoje polecenie nie działa na Linuksie :( – hugemeow

2

Można użyć find w tej krótkiej formie:

find \(-name '*.cpp' -o -name '*.h' \) -print 

-print można pominąć. Używanie -o tylko pomiędzy wyrażeniami jest szczególnie przydatne, gdy chcesz znaleźć wiele typów plików i wykonać to samo zadanie (powiedzmy obliczając md5sum).

2

krótki, jasny sposób to zrobić z find jest:

find . -regex '.*\.\(cpp\|h\)' 

Od strony man dla -regex: "To jest mecz na całej ścieżce, a nie wyszukiwania." Stąd potrzeba przedrostka z .*, aby dopasować początek ścieżki ./dir1/dir2/... przed nazwą pliku.

Powiązane problemy