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


44

私はすべてのファイルのリストにしようとしていますdir1dir2dir3そしてdir4それは私がのサブディレクトリとしての任意の場所にあるかもしれないcwd使用してfindコマンドを。私は次のことを試みましたが成功しませんでした:

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

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


見つける 。-type f -regextype sed -regex "。* / dir [1-4] / [a-z0-9] *" ..これまでの最短回答:)以下の回答を参照してください。unix.stackexchange.com/a/ 390333 / 242983
alpha_989

回答:


59

そして、あなたが名前の3つのフォルダを検索したい場合はfoobar、およびbazすべてのため*.pyのファイル、次のコマンドを使用します。

find foo bar baz -name "*.py"

dir1 dir2 dir3使用中のファイルを表示する場合find dir1 dir2 dir3 -type f

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


明確にすべきでした。検索したいファイルへのパスがないかもしれません。それらが現在のディレクトリのサブディレクトリであることだけを知っています。
アーロン

./dir代わりに使用してdir
ください-harish.venkat

dirはまだcwdにある必要がありますが、2レベル下(たとえば./path/to/dir1)である場合./dir1があり、その場合は存在しません。
アーロン

答えを編集しました。
harish.venkat

8

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

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

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


括弧が間違った場所にあります。また-a-oGNUの-and/ と同等の標準についても参照してください-or
ステファンシャゼラス

4

みんなに知らせるためだけに。が完全なパスと一致しているように見えるため、.*/それぞれdirが問題を解決する前に追加しregexます。


3

これは、以前の回答を読んだ後の私の最初のアイデアです。

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

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


2

ワイルドカード(ホームディレクトリ)および一般的なapache2ログディレクトリで定義された複数の場所で特定のファイル(access_log)を見つけるfast(!)のサンプル。ここでの質問には直接答えませんが、これらの指示を見つけた人(私のような)にとっては使いやすいかもしれません。

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

特別に近く、スペースの使用に注意してください\(\)

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

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


(1)アーロンの正確な状況や要件を知ることはできないかもしれませんが、他の答えでは、名前が指定されていない4つのディレクトリがあると慎重に判断しています。(彼らは可能性がありredgreenblueおよびyellow、または、彼らは可能性がありJohnPaulGeorgeRingo。)あなたの答えは、彼らがしていることを前提とし、文字通り dir1dir2dir3dir4。…(続き)
スコット

(続き)…(2)なぜアーロンはサブディレクトリを検索したくないと思いますか?彼はそうしていると言っているようです。(3)なぜあなたは、その名の小文字と数字のみが含まれている(のようなものを除いて、ファイルへの検索を制限しているfoo_barfoo.txtFOO)?(4)/[^/]*答えが使用しないのに、なぜテキストが説明するのですか?
スコット

こんにちはスコット、あなたのコメントをありがとう。
alpha_989

(1-3)。彼は「dir1、dir2、dir3、dir4のすべてのファイルリストしようとしている」と述べています。これはcwd のサブディレクトリとしてどこにでもあります。つまり、dir1-dir4はどこにでもありますが、 dir1-dir4内。もちろん、dir1-dir4ではない場合、red \ | blue \ | green \ |を使用して特定の名前に変更する必要があります など
alpha_989

4.誤植。.以前[a-z0-9] *を使用していました。その後、[^ /] *がより短く、より包括的であることに気付きました。慎重なコメントをありがとう。
alpha_989

0

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

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

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

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

$ 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.