Jak znaleźć pliki tylko w podanym katalogu i ignorować podkatalogi za pomocą basha

135

Przyjrzałem się innym podobnym pytaniom, ale nie znalazłem takiego, które pozwoliłoby mi zrozumieć koncepcję i zastosować ją do mojej sytuacji w oparciu o mój ograniczony czas. Po prostu uruchamiam polecenie wyszukiwania, aby znaleźć określone pliki, ale niektóre pliki w podkatalogach mają tę samą nazwę, którą chcę zignorować. Dzięki za wszelką pomoc. Poniżej znajduje się polecenie, którego używam:

Interesujące mnie pliki / wzorzec: / dev / abc-scanner, / dev / abc-cash ....

Komenda:

find /dev/ -name 'abc-*'

Co jest zwracane:

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

Chcę zignorować te ostatnie pliki: /dev/.udev / ...

sufa
źródło
9
ignorować określone podkatalogi lub nie schodzić do żadnych podkatalogów? W tym drugim przypadku użyj opcji -maxdepth 1
frankc
@frankc Opublikuj jako odpowiedź.
cnicutar
możliwy duplikat wykluczenia katalogu z wyszukiwania. polecenie
Przywróć Monikę Proszę,

Odpowiedzi:

211

Jeśli chcesz tylko ograniczyć znajdowanie do pierwszego poziomu, możesz zrobić:

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

... lub jeśli szczególnie chcesz wykluczyć .udevkatalog, możesz zrobić:

 find /dev -name '.udev' -prune -o -name 'abc-*' -print
Mark Longair
źródło
Gdybym chciał wymienić wszystkie powyższe dowiązania symboliczne w powyższym wzorze, czy po prostu użyłbym potoku? Coś w rodzaju find / dev -maxdepth 1 -name 'abc- *' | ls -l
suffa
1
Lepiej użyć xargszamiast tego, więc coś w stylu: find /dev -maxdepth 1 -name 'abc-*' | xargs ls -lale jeśli jest jakaś szansa, że ​​będą mieli spacje w nazwach, powinieneś to zrobićfind /dev -maxdepth 1 -name 'abc-*' -print0 | xargs -0 ls -l
Mark Longair
Jednak, jak wskazuje odpowiedź Stephena Darlingtona , nie jestem pewien, dlaczego nie zrobiłbyś tego po prostuls -l /dev/abc-*
Mark Longair
Ponadto, jeśli chcesz dowiedzieć się, dokąd prowadzą for x in /dev/abc-*; do readlink -f $x; done
linki
1
Lub jeśli chcesz podkatalogi tylko na pierwszym poziomie, ls -l /dev/abc-* /dev/*/abc-* | fgrep -v /dev/.udev... z wyjątkiem tego , że przynajmniej na moim Linuksie /dev/*/*nie zawiera plików, /dev/.udev/*więc możesz pominąć rozszerzenie fgrep -v.
tripleee
9

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

ls /dev/abc-*

Jeśli musisz użyć find, możesz użyć -maxdepth 1przełącznika, aby zastosować tylko do określonego katalogu.

Stephen Darlington
źródło
Myślę, że masz na myśli -maxdepth 1raczej niż-maxdepth 0
Mark Longair
5
Należy zauważyć, że symbol wieloznaczny jest tutaj ważną częścią, a nie ls. Możesz znaleźć te same pliki za pomocą echolub wclub tego, co masz, ponieważ powłoka rozszerza dla ciebie symbol wieloznaczny. Więc for file in /dev/abc-*; do something with each "$file"; donemoże właśnie tego szuka OP.
tripleee
1
Ach, nigdy nie pamiętam, gdzie to jest ... Dzięki za edycję. Warto też zauważyć, że nie jest uniwersalny. Na przykład wersja Solaris findgo nie ma.
Stephen Darlington
@tripleee +1. Tak. Najlepiej byłoby zrobić to wszystko w muszli, jeśli to możliwe.
Stephen Darlington
1
@MustafaOzturk To lsjest zbędne. for f in abc*; ...to wszystko czego potrzebujesz.
Stephen Darlington
4

To może zrobić, co chcesz:

find /dev \( ! -name /dev -prune \) -type f -print
Chris J
źródło
2
Tak, to działa. -maxdepth nie jest zaimplementowane w find na niektórych starszych Uniksach.
CCTO
0

Dotarłem tutaj z nieco bardziej ogólnym problemem - chciałem znaleźć pliki w katalogach pasujących do wzorca, ale nie w ich podkatalogach.

Moje rozwiązanie (zakładając, że szukamy wszystkich cppplików znajdujących się bezpośrednio w archkatalogach):

find . -path "*/arch/*/*" -prune -o -path "*/arch/*.cpp" -print

Nie mogłem użyć maxdepth, ponieważ ograniczało ono przede wszystkim wyszukiwanie i nie znałem nazw podkatalogów, które chciałem wykluczyć.

S. Kaczor
źródło
-1
find /dev -maxdepth 1 -name 'abc-*'

Nie działa dla mnie. Nic nie zwraca. Jeśli po prostu to zrobię ”. daje mi wszystkie pliki w katalogu poniżej tego, nad którym pracuję.

find /dev -maxdepth 1 -name "*.root" -type 'f' -size +100k -ls

Nic nie zwracaj z „.” zamiast tego otrzymuję listę wszystkich „dużych” plików w moim katalogu, a także katalog rootfiles /, w którym przechowuję stare.

Kontynuacja. To działa.

find ./ -maxdepth 1 -name "*.root" -type 'f' -size +100k -ls
564751   71 -rw-r--r--   1 snyder   bfactory   115739 May 21 12:39 ./R24eTightPiPi771052-55.root
565197  105 -rw-r--r--   1 snyder   bfactory   150719 May 21 14:27 ./R24eTightPiPi771106-2.root
565023   94 -rw-r--r--   1 snyder   bfactory   134180 May 21 12:59 ./R24eTightPiPi77999-109.root
719678   82 -rw-r--r--   1 snyder   bfactory   121149 May 21 12:42 ./R24eTightPiPi771098-10.root
564029  140 -rw-r--r--   1 snyder   bfactory   170181 May 21 14:14 ./combo77v.root

Najwyraźniej /dev oznacza katalog zainteresowania. Ale ./jest potrzebny, a nie tylko .. Potrzeba tego /nie była oczywista nawet po tym, jak zorientowałem się, co /devznaczy mniej więcej.

Nie mogłem odpowiedzieć jako komentarz, ponieważ nie mam „reputacji”.

Athur Snyder
źródło
1
Zyskujesz reputację, udzielając dobrych odpowiedzi. Przeczytaj ten stackoverflow.com/conduct
aifrim
Są powody, dla których nie możesz komentować, a to nie daje Ci pozwolenia na umieszczanie komentarzy w sekcji Odpowiedź. Usuń to.
Rob