ohne Rekursion finden

246

Ist es möglich, den findBefehl so zu verwenden, dass er nicht in die Unterverzeichnisse zurückkehrt? Beispielsweise,

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

Und das Ergebnis von so etwas find DirsRoot --donotrecuourse -type fwird nur sein File1, File2?

Filippo
quelle

Antworten:

380

Ich denke, Sie werden mit der -maxdepth 1Option das bekommen, was Sie wollen , basierend auf Ihrer aktuellen Befehlsstruktur. Wenn nicht, können Sie versuchen, auf der Manpage nach zu suchenfind .

Relevanter Eintrag (der Einfachheit halber):

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

Ihre Optionen sind im Grunde:

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

Oder:

find DirsRoot/ -maxdepth 1 -type f #This does show hidden files
Eldarerathis
quelle
Für das Beispiel des OP denke ich, dass dies sein muss -maxdepth 1?
Paul R
@Paul R: Eigentlich hängt das davon ab, wie er mit versteckten Dateien umgehen will, aber ich habe meine Antwort trotzdem geändert. Für sein Beispiel 1ist es wahrscheinlich, was er will.
Eldarerathis
1
Für mich -maxdepth 0wird keine Datei -maxdepth 1angezeigt, aber es funktioniert wie beabsichtigt, und versteckte Dateien werden ebenfalls angezeigt.
Bruce Wayne
1
@ BruceWayne beachten Sie die *in find DirsRoot/* -maxdepth 0 -type f. Wenn Sie das weglassen, werden keine Dateien angezeigt.
Mapeters
@mook, danke, aber ich kann mich nicht an den ursprünglichen Kontext erinnern, in dem ich dieses Problem hatte, haha.
Bruce Wayne
33

Ich glaube du suchst -maxdepth 1.

Waffelparadoxon
quelle
1
Für das Beispiel des OP denke ich, dass dies sein muss -maxdepth 1?
Paul R
Ja, wenn er den Befehl genau wie in seinem Beispiel verwenden würde, wäre es 1. Mein Fehler.
Waffel Paradoxon
17

Wenn Sie nach einer POSIX-kompatiblen Lösung suchen:

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

-maxdepth ist keine POSIX-kompatible Option.

sqr163
quelle
Vielen Dank für diese Lösung, aber kann dies nicht vereinfacht werden find DirsRoot/* -type f -prune?
Dokaspar
@dokaspar Wirklich tolle Frage! (Sie haben zuvor vergessen, "-o" einzufügen-prune übrigens einzufügen) Die Antwort ist nein, kann es nicht. Um vollständig zu verstehen, WARUM es nicht vereinfacht werden kann, geben Sie einfach einen set -xBefehl aus, bevor find DirsRoot/* -type f -o -pruneSie den ausgeben, und Sie werden ihn sofort selbst sehen. Die Hauptursache sind die Einschränkungen der Shell-Erweiterung des DirsRoot/*Ausdrucks.
sqr163
arbeitet nicht an Centos, macht immer noch volle Rekursion bei der Ausgabe !!!! Der richtige Befehl istfind . -name . -o -prune
Reishin
Unter Solaris benötigen Sie ohnehin keine CD, wenn Sie DirsRoot als gewünschten Pfad verwenden. Stattdessen können Sie: DirsRoot / finden. -Typ f -print -o -name. -o -prune
spioter