web-dev-qa-db-ja.com

パスを照合してファイルを見つける

いくつかのサブディレクトリを含むディレクトリがあります。これらの各サブディレクトリには、すべて同じ名前のサブディレクトリが含まれています。これらすべてのファイルのリストをコマンドラインで作成したいと思います。したがって、たとえば、私が持っている場合:

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/

次の出力が欲しいです。

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

私はこれがtooを使用して難しいとは思わないfindを使用しますが、私はそれを理解することができませんでした。この問題は非常に具体的であるため検索が困難であり、「パスで一致するファイルを検索する」だけを検索しても有用なものは何も生成されません。

7
Mees de Vries

これを試して

find */subdir -type f
8
Carl

実際にはfindは必要ありません。単純なlsは次のことを行います。

$ 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

または、それらのファイルをリストするだけでなく、それらのファイルで何かをしたい場合は、シェルグロブを使用します。

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

もちろん、subdirというサブディレクトリにあるものはすべてリストされます。ディレクトリ、シンボリックリンク、デバイスファイルなどを含む。通常のファイルに制限する場合は、@ Carlのfind "*/subdir" -type f提案どおり を使用するか、ファイルテストを追加します。

for file in */subdir/*; do [ -f "$file" ] && command "$file"; done
8
terdon

findのより良い回避策は、-pathオプションを使用することです。

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

より複雑な構造を持っている場合に便利です。何かのようなもの:

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

上記の例では、find */subdir -type fのようなものは、最初のsubdir内のファイルのみを検索します。ただし、find -path "*/subdir/*" -type fは正常に機能します。

2
Ravexina

適切なツールを使用するだけです:

locate "/subdir/"

あなたは(再)実行したいかもしれません:

Sudo updatedb

ロケートのデータベースを更新する必要がある場合(最近追加されたファイルを検索する場合の例)、毎日crontabsを介して構築する必要があります(その時点でPCが実行されている場合)

最初のupdatedbが必要な場合、特定のfindよりも遅く見えるかもしれませんが、最終的には、後続のすべてのクエリが高速で実行されるため、はるかに高速です。

1
Olivier Dulac