znajdź bez rekurencji

246

Czy można użyć findpolecenia w taki sposób, aby nie powracało do podkatalogów? Na przykład,

DirsRoot
  |-->SubDir1
  |    |-OtherFile1
  |-->SubDir2
  |    |-OtherFile2
  |-File1
  |-File2

A wynik czegoś takiego find DirsRoot --donotrecuourse -type fbędzie tylko File1, File2?

filippo
źródło

Odpowiedzi:

380

Myślę, że dostaniesz to, czego chcesz dzięki tej -maxdepth 1opcji, w oparciu o twoją obecną strukturę poleceń. Jeśli nie, można spróbować patrząc na manualu dla find.

Odpowiedni wpis (dla wygody):

-maxdepth levels
          Descend at most levels (a non-negative integer) levels of direc-
          tories below the command line arguments.   `-maxdepth  0'  means
          only  apply the tests and actions to the command line arguments.

Twoje opcje to w zasadzie:

find DirsRoot/* -maxdepth 0 -type f #This does not show hidden files

Lub:

find DirsRoot/ -maxdepth 1 -type f #This does show hidden files
eldarerathis
źródło
Dla przykładu PO myślę, że tak musi być -maxdepth 1?
Paul R
@Paul R: Właściwie to zależy od tego, jak chce obsługiwać ukryte pliki, ale mimo to poprawiłem moją odpowiedź. Jego przykład 1jest prawdopodobnie tym, czego chce.
eldarerathis
1
Dla mnie -maxdepth 0nie pokazuje żadnego pliku, ale -maxdepth 1działa zgodnie z przeznaczeniem, a także wyświetla ukryte pliki.
Bruce Wayne
1
@BruceWayne zauważyć *in find DirsRoot/* -maxdepth 0 -type f. Jeśli to pominiesz, nie wyświetli żadnych plików.
mapery
@mook, Dzięki, ale nie pamiętam oryginalnego kontekstu, w którym miałem ten problem, haha.
Bruce Wayne,
33

Wierzę, że szukasz -maxdepth 1.

paradoks waflowy
źródło
1
Dla przykładu PO myślę, że tak musi być -maxdepth 1?
Paul R
Tak, gdyby używał polecenia dokładnie tak, jak w przykładzie, byłby to 1. Mój błąd.
paradoks
17

Jeśli szukasz rozwiązania zgodnego z POSIX:

cd DirsRoot && find . -type f -print -o -name . -o -prune

-maxdepth nie jest opcją zgodną z POSIX.

sqr163
źródło
dzięki za to rozwiązanie, ale czy nie można tego uprościć find DirsRoot/* -type f -prune?
dokaspar
@dokaspar Naprawdę świetne pytanie! (zapomniałeś wstawić „-o” przed -prunebtw) Odpowiedź brzmi nie, nie może. Aby w pełni zrozumieć DLACZEGO nie można tego uprościć, po prostu wyślij set -xpolecenie przed jego wysłaniem, find DirsRoot/* -type f -o -prunea natychmiast zobaczysz to sam. Główną przyczyną są ograniczenia ekspansji powłoki DirsRoot/*.
sqr163
nie działa na centos, nadal wykonuje pełną rekurencję na wyjściu !!!! Prawidłowe polecenie tofind . -name . -o -prune
Reishin,
w systemie Solaris, utrzymując DirsRoot jako pożądaną ścieżkę, nie potrzebujesz cd; zamiast tego możesz: znaleźć DirsRoot /. -type f -print -o -name. -o -prune
spioter