web-dev-qa-db-ja.com

複数のフォルダ名でファイルを検索する

私はcwdのサブディレクトリとしてどこにでもある可能性があるdir1dir2dir3およびdir4からのすべてのファイルを一覧表示しようとしていますfindコマンド。私は次のことを試みましたが成功しませんでした:

find . -type f -regextype posix-egrep -regex 'dir1/.+|dir2/.+|dir3/.+|dir4/.+'

posix-extendedも試しました。これらのファイルを一覧表示するにはどうすればよいですか?

48
Aaron

また、foobar、およびbazという名前の3つのフォルダーですべての_*.py_ファイルを検索する場合は、次のコマンドを使用します。

_find foo bar baz -name "*.py"_

したがって、_dir1_からファイルを表示する場合は、_dir2_ _dir3_ _find dir1 dir2 dir3 -type f_を使用します

これを試してくださいfind . \( -name "dir1" -o -name "dir2" \) -exec ls '{}' \;

65
harish.venkat

-pathディレクティブを使用するのが最善です。

find .  \( -type f -and -path '*/dir1/*' -or -path '*/dir2/*' -or -path '*/dir3/*' -or -path '*/dir4/*' \)

つまり、パスに「dir1」または「dir2」または「dir3」または「dir4」がある現在のディレクトリの下のすべてのファイルを検索します。

10

みんなに知らせるためだけに。各dirの前に.*/を追加すると、regexが想定されるフルパスと一致するため、問題が解決しました。

4
Aaron

これは前の答えを読んだ後の私の最初のアイデアです:

find . -type f -regextype posix-egrep -regex ".*/(dir1|dir2|dir3|dir4)/.+"

これは、正規表現がファイル名全体と一致する必要があることを考慮に入れており、理解しやすくなっています。

3
Ronin Tom

ワイルドカード(ホームディレクトリ)で定義された複数の場所で特定のファイル(access_log)を見つけるfast(!)のサンプルと、sslログとgzip圧縮された古いログを除外する名前フィルタリングも適用する一般的なApache2ログディレクトリ。ここでの質問には直接回答しませんが、これらの指示を見つけた人(私のような)にとっては役に立つかもしれません。

find / \( -path "*var/log/Apache2*" -o -path "*home/*/logs*" \) -type f  -name "*access_log" ! -name "*ssl*"

特に\(\)の近くにあるスペースには注意してください。

ちなみに、私はこれをapachetopに使用して、サーバーで最もアクティブなWebサイトを見つけました。

apachetop -d1 -s9 -p $(find / \( -path "*var/log/Apache2*" -o -path "*home/*/logs*" \) -type f  -name "*access_log" ! -name "*ssl*" -print | sed 's/^/-f '/)
2

regextypeを使用している場合は、名前でdir1からdir4を指定する必要はありません。

find . -type f -regextype sed -regex ".*/dir[1-4]/[^/]*"
  • type f:ディレクトリではなくファイルを検索
  • regextype sed:sed regextypeを使用します
  • regex:パス全体で正規表現を使用して検索します
  • ".*/dir[1-4]/[a-z0-9]*":最初の。*は、タイプ(char/number/backslash(/)など)になる可能性のある任意の数の文字を意味します。 dir [1-4]は、「dir」の後に1〜4の数字が続くことを意味します。/[^ /] *は、dir1-4の後に/が含まれているパス名を省略しているため、dir1-dir4ディレクトリ内のファイルのみを返し、dir1-dir4内にあるサブディレクトリは無視することを示しています。

テスト用のディレクトリを作成しました: https://github.com/alphaCTzo7G/stackexchange/tree/master/linux/findSolution04092017

2
alpha_989

Findを使用して指定したことは知っていますが、使用できる他のオプションを示すためにのみ、xargsを使用できます。

find . -type d | grep -E "dir1$|dir2$" | xargs ls  

find . -name "dir1" -or -name "dir2" | xargs ls

次のようなものを含む「フォルダ」という名前のファイルを作成できます。

$ cat folders
dir1
dir2
dir3
dir4

その後、次のようなことができます:

$ cat folders | xargs -I % find . -type d -name % | xargs ls
./Documents/dir1:
file1  file2  file3  file4

./Documents/dir2:
file1  file2  file3  file4

./Documents/dir3:
file1  file2  file3  file4

./Documents/dir4:
file1  file2  file3  file4

私の意見ではxargsですが、find -execよりも用途が広いと感じています。また、あなたは次のようなクレイジーなものを作ることができます

$ cat << EOF | xargs -I {} find ~ -name "{}" | xargs ls
> dir1
> dir2
> dir3
> EOF
/home/user/Documents/dir1:
file1  file2  file3  file4

/home/user/Documents/dir2:
file1  file2  file3  file4

/home/user/Documents/dir3:
file1  file2  file3  file4
0
Cuauhtli