私はcwd
のサブディレクトリとしてどこにでもある可能性があるdir1
、dir2
、dir3
およびdir4
からのすべてのファイルを一覧表示しようとしていますfind
コマンド。私は次のことを試みましたが成功しませんでした:
find . -type f -regextype posix-egrep -regex 'dir1/.+|dir2/.+|dir3/.+|dir4/.+'
posix-extended
も試しました。これらのファイルを一覧表示するにはどうすればよいですか?
また、foo
、bar
、および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 '{}' \;
-pathディレクティブを使用するのが最善です。
find . \( -type f -and -path '*/dir1/*' -or -path '*/dir2/*' -or -path '*/dir3/*' -or -path '*/dir4/*' \)
つまり、パスに「dir1」または「dir2」または「dir3」または「dir4」がある現在のディレクトリの下のすべてのファイルを検索します。
みんなに知らせるためだけに。各dir
の前に.*/
を追加すると、regex
が想定されるフルパスと一致するため、問題が解決しました。
これは前の答えを読んだ後の私の最初のアイデアです:
find . -type f -regextype posix-egrep -regex ".*/(dir1|dir2|dir3|dir4)/.+"
これは、正規表現がファイル名全体と一致する必要があることを考慮に入れており、理解しやすくなっています。
ワイルドカード(ホームディレクトリ)で定義された複数の場所で特定のファイル(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 '/)
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
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