trova senza ricorsione


246

È possibile utilizzare il findcomando in un modo che non ricercherà nelle sottodirectory? Per esempio,

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

E il risultato di qualcosa del genere find DirsRoot --donotrecuourse -type fsarà solo File1, File2?

Risposte:


380

Penso che otterrai ciò che vuoi con l' -maxdepth 1opzione, in base alla tua attuale struttura di comando. Altrimenti, puoi provare a guardare la pagina man per find.

Voce pertinente (per comodità):

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

Le tue opzioni sono sostanzialmente:

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

O:

find DirsRoot/ -maxdepth 1 -type f #This does show hidden files

Per l'esempio del PO penso che debba essere -maxdepth 1?
Paolo R,

@Paul R: In realtà, questo tipo di dipende da come vuole gestire i file nascosti, ma ho comunque modificato la mia risposta. Per il suo esempio 1è probabilmente quello che vuole.
eldarerathis,

1
Per me, -maxdepth 0non mostra alcun file ma -maxdepth 1funziona come previsto, anche con i file nascosti visualizzati.
Bruce Wayne,

1
@BruceWayne annota l' *in find DirsRoot/* -maxdepth 0 -type f. Se lo lasci fuori, non mostrerà alcun file.
mapeters

@mook, grazie, ma non ricordo il contesto originale in cui ho avuto questo problema, ahah.
Bruce Wayne,


17

Se cerchi una soluzione conforme a POSIX:

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

-maxdepth non è un'opzione conforme a POSIX.


grazie per questa soluzione, ma non è possibile semplificarlo find DirsRoot/* -type f -prune?
dokaspar,

@dokaspar Davvero un'ottima domanda! (hai dimenticato di inserire "-o" prima di -prunebtw) La risposta è no, non può. Per comprendere appieno PERCHÉ non può essere semplificato, basta emettere il set -xcomando prima di emettere il find DirsRoot/* -type f -o -prunee lo vedrai immediatamente tu stesso. La causa principale sono i limiti dell'espansione della shell dell'espressione DirsRoot/*.
sqr163,

non funziona su centos, sta ancora facendo la ricorsione completa in uscita !!!! Il comando corretto èfind . -name . -o -prune
Reishin,

su Solaris comunque, mantenendo DirsRoot come percorso desiderato, non è necessario cd; invece puoi: trovare DirsRoot /. -type f -print -o -name. -o -prune
spioter
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.