2011-10-10 11 views
61

Przyjrzałem się innym podobnym pytaniom, ale nie znalazłem takiego, które umożliwiałoby mi uchwycenie tego pojęcia i uczynienie go odpowiednim do mojej sytuacji w oparciu o moje ograniczone czas. Po prostu używam polecenia find, aby znaleźć określone pliki, ale niektóre pliki w podkatalogach mają tę samą nazwę, którą chcę zignorować. Dzięki za pomoc. Poniżej jest polecenie, które używam:Jak znaleźć tylko pliki w danym katalogu i zignorować podkatalogi za pomocą bashu

pliki/wzór Jestem zainteresowany: /dev/abc-skanera,/dev/abc-gotówka ....

Polecenie:

find /dev/ -name 'abc-*' 

Co zwracane:

/dev/abc-scanner 
/dev/abc-cash 
... 
... 
... 
/dev/.udev/names/abc-scanner 
/dev/.udev/names/abc-cash 

chcę ignorować te ostatnie pliki: /dev/.udev/...

+7

ignorować konkretne podkatalogi, czy nie zejść na każdym subdire ctories? W drugim przypadku użyj opcji -maxdepth 1 – frankc

+0

@frankc Opublikuj jako odpowiedź. – cnicutar

+0

możliwy duplikat [wyklucz katalog z wyszukiwania. command] (http://stackoverflow.com/questions/4210042/exclude-directory-from-find-command) – BroSlow

Odpowiedz

95

Jeśli chcesz po prostu ograniczyć znalezisko na pierwszym poziomie można zrobić:

find /dev -maxdepth 1 -name 'abc-*' 

... lub jeśli szczególnie chcą wykluczyć katalog .udev, można zrobić:

find /dev -name '.udev' -prune -o -name 'abc-*' -print 
+0

Jeśli chciałbym wyświetlić listę wszystkich wyżej wymienionych dowiązań symbolicznych wskazanych w powyższym wzorze, czy po prostu użyłbym rury? Coś jak find/dev -maxdepth 1 -name 'abc- *' | ls -l – suffa

+1

Zamiast tego lepiej używać 'xargs', więc coś takiego:' find/dev -maxdepth 1 -name 'abc- *' | xargs ls -l', ale jeśli istnieje szansa, że ​​będą miały białe spacje w nazwach, powinieneś zrobić 'find/dev -maxdepth 1 -name 'abc- *' -print0 | xargs -0 ls -l' –

+0

Jednak, jak [odpowiedź Stephena Darlington'a wskazuje] (http://stackoverflow.com/questions/7715485/how-to-only-find-files-in-a-given-directory-and -ignore-subdirectories-using-bash/7715550 # 7715550), nie jestem pewien, dlaczego nie zrobiłbyś po prostu 'ls -l/dev/abc- *' –

7

Czy istnieje jakiś szczególny powód, dla którego musisz użyć find? Możesz po prostu użyć ls, aby znaleźć pliki pasujące do wzorca w katalogu.

ls /dev/abc-* 

Jeśli trzeba używać find, można użyć przełącznika -maxdepth 1 zastosowanie tylko do określonego katalogu.

+0

Myślę, że masz na myśli '-maxdepth 1' zamiast' -maxdepth 0' –

+4

Należy podkreślić, że wildcard jest tutaj ważną częścią, a nie 'ls'. Możesz znaleźć te same pliki z 'echo' lub' wc' lub co masz, ponieważ powłoka rozwinie dla ciebie wieloznacznik. Więc 'dla pliku w/dev/abc- *; zrób coś z każdym "plikiem $"; done' może być tym, czego faktycznie szuka OP. – tripleee

+1

Ah, nigdy nie pamiętam, w którym kierunku jest ... Dzięki za edycję. Warto też zauważyć, że nie jest to uniwersalne. Wersja "find" dla Solaris nie ma na przykład takiej wersji. –

2

To może robić to, co chcesz:

find /dev \(! -name /dev -prune \) -type f -print 
+0

Tak, to działa. -maxdepth nie jest zaimplementowane w find na starszych Unixach. – CCTO

Powiązane problemy