Suchen Sie die Datei, indem Sie sie auf ihrem Pfad abgleichen

7

Ich habe ein Verzeichnis mit einer Reihe von Unterverzeichnissen. Jedes dieser Unterverzeichnisse enthält ein Unterverzeichnis, die alle denselben Namen haben. Ich möchte eine Liste all dieser Dateien in der Befehlszeile erstellen. Also zum Beispiel, wenn ich habe:

dir1/
    file1.txt
    subdir/
        relevant_file1.c
        relevant_file2.c
dir2/
    file2.txt
    subdir/
        relevant_file3.txt
        relevant_file4.java
dir3/
    subdir/
        relevant_file5.cpp
    irrelevant_subdir/
        unimportant_file.txt
dir4/
    subdir/

Ich hätte gerne folgende Ausgabe:

dir1/subdir/relevant_file1.c
dir1/subdir/relevant_file2.c
dir2/subdir/relevant_file3.txt
dir2/subdir/relevant_file4.java
dir3/subdir/relevant_file5.cpp

Ich nehme an, dass dies nicht zu schwierig sein sollte find, aber ich konnte es nicht ganz herausfinden. Es ist schwierig, nach diesem Problem zu suchen, weil es so spezifisch ist, und nur die Suche nach "Datei durch Matching auf ihrem Pfad finden" bringt nichts Nützliches.

Mees de Vries
quelle
Verwenden Sie einfach locate : locate "/subdir/" . Führen Sie `sudo updatedb` aus, wenn Sie die Datenbank von locate aktualisieren müssen, diese sollte jedoch jeden Tag über crontabs erstellt werden (wenn der PC zu diesem Zeitpunkt ausgeführt wird)
Olivier Dulac

Antworten:

8

Versuche dies

find */subdir -type f
Carl
quelle
8

Das brauchst du eigentlich nicht find. Ein einfacher lsWille reicht aus:

$ ls -1 */subdir/*
dir1/subdir/relevant_file1.c
dir1/subdir/relevant_file2.c
dir2/subdir/relevant_file3.txt
dir2/subdir/relevant_file4.java
dir3/subdir/relevant_file5.cpp

Wenn Sie mit diesen Dateien etwas anfangen und sie nicht nur auflisten möchten, verwenden Sie Shell-Globs:

for file in */subdir/*; do command "$file"; done

Das listet natürlich alles in jedem aufgerufenen Unterverzeichnis auf subdir. Einschließlich Verzeichnisse, Symlinks, Gerätedateien oder irgendetwas anderes. Wenn Sie es auf normale Dateien beschränken möchten, verwenden Sie es find "*/subdir" -type f wie von @Carl vorgeschlagen oder fügen Sie einen Dateitest hinzu:

for file in */subdir/*; do [ -f "$file" ] && command "$file"; done
Terdon
quelle
2

Eine bessere Problemumgehung findist die Verwendung der -pathOption.

find -path "*/subdir/*" -type f

Es ist nützlicher, wenn wir eine komplexere Struktur haben. etwas wie:

.
├── dir1
   ├── gooddir
      └── subdir
          └── file.txt
   ├── irrelevant_subdir
      └── file.txt
   └── subdir
       └── file.txt
└── dir2
    ├── gooddir
       └── subdir
           └── file.txt
    ├── irrelevant_subdir
       └── file.txt
    └── subdir
        └── file.txt

Im obigen Beispiel findet so etwas wie find */subdir -type fnur Dateien innerhalb eines ersten subdir. Funktioniert jedoch find -path "*/subdir/*" -type fgut.

Ravexina
quelle
1

Verwenden Sie einfach das entsprechende Tool:

locate "/subdir/"

Möglicherweise möchten Sie Folgendes (erneut) ausführen:

sudo updatedb

Wenn Sie die Datenbank von locate aktualisieren müssen (z. B. wenn Sie kürzlich hinzugefügte Dateien suchen möchten), diese jedoch jeden Tag über crontabs erstellt werden sollte (wenn der PC zu diesem Zeitpunkt ausgeführt wird).

Wenn Sie die anfängliche Aktualisierung benötigen, scheint sie langsamer zu sein als die spezifische Suche, aber am Ende ist sie viel schneller, da alle nachfolgenden Abfragen SCHNELL ausgeführt werden.

Olivier Dulac
quelle