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 / ...


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

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

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.


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

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ć.


-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”.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.