いくつかのサブディレクトリを含むディレクトリがあります。これらの各サブディレクトリには、すべて同じ名前のサブディレクトリが含まれています。これらすべてのファイルのリストをコマンドラインで作成したいと思います。したがって、たとえば、私が持っている場合:
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
を使用しますが、私はそれを理解することができませんでした。この問題は非常に具体的であるため検索が困難であり、「パスで一致するファイルを検索する」だけを検索しても有用なものは何も生成されません。
これを試して
find */subdir -type f
実際には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
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
は正常に機能します。
適切なツールを使用するだけです:
locate "/subdir/"
あなたは(再)実行したいかもしれません:
Sudo updatedb
ロケートのデータベースを更新する必要がある場合(最近追加されたファイルを検索する場合の例)、毎日crontabsを介して構築する必要があります(その時点でPCが実行されている場合)
最初のupdatedbが必要な場合、特定のfindよりも遅く見えるかもしれませんが、最終的には、後続のすべてのクエリが高速で実行されるため、はるかに高速です。