So finden Sie nur Dateien in einem bestimmten Verzeichnis und ignorieren Unterverzeichnisse mit bash


129

Ich habe mir andere ähnliche Fragen angesehen, aber keine gefunden, die es mir ermöglichen würde, das Konzept zu erfassen und es aufgrund meiner begrenzten Zeit auf meine Situation anzuwenden. Ich führe einfach den Befehl find aus, um bestimmte Dateien zu finden, aber einige Dateien in Unterverzeichnissen haben denselben Namen, den ich ignorieren möchte. Vielen Dank für jede Hilfe. Unten ist der Befehl, den ich benutze:

Die Dateien / Muster, die mich interessieren: / dev / abc-scanner, / dev / abc-cash ....

Der Befehl:

find /dev/ -name 'abc-*'

Was wird zurückgegeben:

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

Ich möchte die letzteren Dateien ignorieren: /dev/.udev / ...


9
Bestimmte Unterverzeichnisse ignorieren oder nicht in Unterverzeichnisse absteigen? Für letztere verwenden Sie die Option -maxdepth 1
frankc

@frankc Poste es als Antwort.
Cnicutar

Antworten:


202

Wenn Sie den Fund nur auf die erste Ebene beschränken möchten, können Sie Folgendes tun:

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

... oder wenn Sie das .udevVerzeichnis besonders ausschließen möchten , können Sie Folgendes tun:

 find /dev -name '.udev' -prune -o -name 'abc-*' -print

Wenn ich auflisten möchte, wo alle oben genannten Symlinks auf das obige Muster verweisen, würde ich dann einfach eine Pipe verwenden? So etwas wie find / dev -maxdepth 1 -name 'abc- *' | ls -l
Suffa

1
Es ist besser, xargsstattdessen zu verwenden , also so etwas wie: find /dev -maxdepth 1 -name 'abc-*' | xargs ls -lAber wenn es eine Chance gibt, dass die Namen Leerzeichen enthalten, sollten Sie dies tunfind /dev -maxdepth 1 -name 'abc-*' -print0 | xargs -0 ls -l
Mark Longair

Wie Stephen Darlingtons Antwort zeigt , bin ich mir nicht sicher, warum Sie es nicht einfach tun würdenls -l /dev/abc-*
Mark Longair

Wenn Sie herausfinden möchten, wohin Symlinks verweisen, können Sie dies auch tunfor x in /dev/abc-*; do readlink -f $x; done
Mark Longair

1
Oder wenn Sie Unterverzeichnisse nur auf der ersten Ebene möchten, ls -l /dev/abc-* /dev/*/abc-* | fgrep -v /dev/.udev... außer zumindest unter meinem Linux sind /dev/*/*keine Dateien enthalten, /dev/.udev/*so dass Sie das weglassen können fgrep -v.
Tripleee

9

Gibt es einen bestimmten Grund, den Sie verwenden müssen find? Sie können nur lsDateien suchen, die einem Muster in einem Verzeichnis entsprechen.

ls /dev/abc-*

Wenn Sie verwenden müssen find, können Sie den -maxdepth 1Schalter verwenden, um nur auf das angegebene Verzeichnis anzuwenden.


Ich denke du meinst -maxdepth 1eher als-maxdepth 0
Mark Longair

5
Es sollte darauf hingewiesen werden, dass der Platzhalter hier der wichtige Teil ist, nicht ls. Sie können die gleichen Dateien mit echooder wcoder was haben Sie finden, weil die Shell den Platzhalter für Sie erweitert. So for file in /dev/abc-*; do something with each "$file"; donekönnte das sein , was die OP wirklich sucht.
Tripleee

1
Ah, ich kann mich nie erinnern, wie es ist ... Danke für die Bearbeitung. Erwähnenswert ist auch, dass es nicht universell ist. Die Solaris-Version von findhat es zum Beispiel nicht.
Stephen Darlington

@tripleee +1. Jep. Wenn möglich, wäre es vorzuziehen, alles in der Shell zu tun.
Stephen Darlington

1
@MustafaOzturk Das lsist überflüssig. for f in abc*; ...ist alles, was du brauchst.
Stephen Darlington

4

Dies kann tun, was Sie wollen:

find /dev \( ! -name /dev -prune \) -type f -print

2
Ja, das funktioniert. -maxdepth ist auf einigen älteren Unixen nicht in find implementiert.
CCTO

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

Funktioniert bei mir nicht Es gibt nichts zurück. Wenn ich nur '.' Es gibt mir alle Dateien im Verzeichnis unter dem, an dem ich arbeite.

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

Gib nichts mit '.' Stattdessen erhalte ich eine Liste aller "großen" Dateien in meinem Verzeichnis sowie die Stammdateien / das Verzeichnis, in dem ich alte speichere.

Auch weiterhin. Das funktioniert.

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

Bedeutet anscheinend /dev Verzeichnis von Interesse. Wird ./aber nicht nur benötigt .. Die Notwendigkeit für /war nicht offensichtlich, selbst nachdem ich herausgefunden hatte, was /devmehr oder weniger bedeutete.

Ich konnte nicht als Kommentar antworten, da ich keinen "Ruf" habe.


1
Sie gewinnen an Ansehen, wenn Sie gute Antworten geben. Bitte lesen Sie diese stackoverflow.com/conduct
aifrim

Es gibt Gründe, warum Sie keine Kommentare abgeben dürfen, und das gibt Ihnen keine Erlaubnis, hier im Abschnitt "Antworten" Kommentare abzugeben. Bitte löschen Sie diese.
Rob
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.