findでディレクトリを除外する方法。コマンド

1492
helion3 2010-11-18 12:57.

findすべてのJavaScriptファイルに対してコマンドを実行しようとしていますが、特定のディレクトリを除外するにはどうすればよいですか?

findこれが私たちが使用しているコードです。

for file in $(find . -name '*.js') do java -jar config/yuicompressor-2.4.2.jar --type js $file -o $file
done

30 answers

1272
f10bit 2010-11-18 13:00.

-pruneスイッチを使用してください。たとえば、miscディレクトリを除外する場合は-path ./misc -prune -o、findコマンドにを追加するだけです。

find . -path ./misc -prune -false -o -name '*.txt'

複数のディレクトリがある例を次に示します。

find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -false -o -name '*.txt'

ここでは除外./dir1./dir2./dir3をしているため、現在のディレクトリにfind表現、それが基準に作用するアクションです-path dir1 -o -path dir2 -o -path dir3(場合DIR1またはdir2のDIR3)、とAND type -d

任意のレベルでディレクトリ名を除外するには、次を使用します-name

find . -type d \( -name node_modules -o -name dir2 -o -path name \) -prune -false -o -name '*.json'
2046
GetFree 2013-04-01 15:26.

場合は-pruneあなたのために動作しません、これは以下となります。

find -name "*.js" -not -path "./directory/*"

警告:不要なディレクトリをすべてトラバースする必要があります。

487
Daniel C. Sobral 2013-05-17 09:01.

私は、他の提案された解決策よりも、以下のことを推論するのが簡単だと思います。

find build -not \( -path build/external -prune \) -name \*.js
# you can also exclude multiple paths
find build -not \( -path build/external -prune \) -not \( -path build/blog -prune \) -name \*.js

重要な注意:後に入力するパスは、除外せずに印刷されるパスと-path正確に一致する必要がありますfind。この文が混乱する場合は次のようにコマンド全体でフルパスを使用するようにしてください。理解を深めたい場合は、注[1]を参照してください。find /full/path/ -not \( -path /full/path/exclude/this -prune \) ...

インサイド\(\)一致する表現で正確に build/external(上の重要な注意を参照)、および意志、成功時には、以下のものを横断避けます。次に、これはエスケープされた括弧で単一の式としてグループ化され、接頭辞が付いて-notいるためfind、その式に一致するものはすべてスキップされます。

追加し-notても他のすべてのファイルが-prune再表示されないかどうかを尋ねる人がいるかもしれませんが、答えはノーです。-prune動作する方法は、到達すると、そのディレクトリの下のファイルが永続的に無視されることです。

これは、wintersmithによって生成されたいくつかのファイルでyui-compressorを呼び出す必要があったが、そのまま送信する必要がある他のファイルを除外するという実際のユースケースから来ています。


注[1]:除外する場合/tmp/foo/bar、この「find /tmp \(...」のようにfindを実行する場合は、を指定する必要があります-path /tmp/foo/bar。一方、このようにfindを実行する場合は、をcd /tmp; find . \(...指定する必要があります-path ./foo/bar

225
Reinstate Monica Please 2014-07-04 14:21.

ここでは、ディレクトリをスキップするための推奨構文がどうあるべきかについて、明らかに混乱があります。

GNUオピニオン

To ignore a directory and the files under it, use -prune

GNUのfindmanページから

推論

-prunefindディレクトリへの下降を停止します。指定-not -pathするだけでもスキップされたディレクトリに移動しますが、各ファイルをテストする-not -pathたびにfalseになりfindます。

の問題 -prune

-prune 意図したとおりに動作しますが、それでも使用時に注意しなければならないことがいくつかあります。

  1. find プルーニングされたディレクトリを出力します。

    • TRUEそれは意図された振る舞いであり、それはただそれに降りることはありません。ディレクトリを完全に出力しないようにするには、論理的に省略した構文を使用します。
  2. -prune-print他のアクションでは機能せず、他のアクションでは機能しません。

    • 真ではありません-pruneを除くすべてのアクションで機能します-delete削除で機能しないのはなぜですか?以下のために-delete仕事に、以来、DFSのために、ディレクトリを横断する必要性を見つける-delete最初など、葉の両親、その後、葉を削除します...しかし、指定するための-prune意味を作るために、findそれを降順ディレクトリとストップをヒットする必要があり、そのはっきりと意味がありません-depth-deleteについて。

パフォーマンス

この質問に対する上位3つの賛成回答の簡単なテストを設定しました(別のアクション例を示すために置き換えられ-printまし-exec bash -c 'echo $0' {} \;た)。結果は以下の通りです

----------------------------------------------
# of files/dirs in level one directories
.performance_test/prune_me     702702    
.performance_test/other        2         
----------------------------------------------

> find ".performance_test" -path ".performance_test/prune_me" -prune -o -exec bash -c 'echo "$0"' {} \;
.performance_test
.performance_test/other
.performance_test/other/foo
  [# of files] 3 [Runtime(ns)] 23513814

> find ".performance_test" -not \( -path ".performance_test/prune_me" -prune \) -exec bash -c 'echo "$0"' {} \; .performance_test .performance_test/other .performance_test/other/foo [# of files] 3 [Runtime(ns)] 10670141 > find ".performance_test" -not -path ".performance_test/prune_me*" -exec bash -c 'echo "$0"' {} \;
.performance_test
.performance_test/other
.performance_test/other/foo
  [# of files] 3 [Runtime(ns)] 864843145

結論

どちらf10bitの構文とダニエルC.ソブラルの構文は、平均的に実行するように10-25msを取りました。を使用しないGetFreeの構文は、865ミリ秒-pruneかかりました。したがって、これはかなり極端な例ですが、実行時間を気にし、リモートで集中的に何かを行う場合は、を使用する必要があります-prune

Daniel C. Sobralの構文は、2つの-prune構文のうち優れたパフォーマンスを示したことに注意してください。しかし、これは、2つの実行順序を切り替えると逆の結果になり、プルーニングされていないバージョンは常に最も遅いため、キャッシュの結果であると強く思います。

テストスクリプト

#!/bin/bash

dir='.performance_test'

setup() {
  mkdir "$dir" || exit 1 mkdir -p "$dir/prune_me/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/w/x/y/z" \
    "$dir/other" find "$dir/prune_me" -depth -type d -exec mkdir '{}'/{A..Z} \;
  find "$dir/prune_me" -type d -exec touch '{}'/{1..1000} \; touch "$dir/other/foo"
}

cleanup() {
  rm -rf "$dir" } stats() { for file in "$dir"/*; do
    if [[ -d "$file" ]]; then count=$(find "$file" | wc -l) printf "%-30s %-10s\n" "$file" "$count" fi done } name1() { find "$dir" -path "$dir/prune_me" -prune -o -exec bash -c 'echo "$0"'  {} \;
}

name2() {
  find "$dir" -not \( -path "$dir/prune_me" -prune \) -exec bash -c 'echo "$0"' {} \; } name3() { find "$dir" -not -path "$dir/prune_me*" -exec bash -c 'echo "$0"' {} \;
}

printf "Setting up test files...\n\n"
setup
echo "----------------------------------------------"
echo "# of files/dirs in level one directories"
stats | sort -k 2 -n -r
echo "----------------------------------------------"

printf "\nRunning performance test...\n\n"

echo \> find \""$dir"\" -path \""$dir/prune_me"\" -prune -o -exec bash -c \'echo \"\$0\"\' {} \\\; name1 s=$(date +%s%N)
name1_num=$(name1 | wc -l) e=$(date +%s%N)
name1_perf=$((e-s)) printf " [# of files] $name1_num [Runtime(ns)] $name1_perf\n\n" echo \> find \""$dir"\" -not \\\( -path \""$dir/prune_me"\" -prune \\\) -exec bash -c \'echo \"\$0\"\' {} \\\;
name2
s=$(date +%s%N) name2_num=$(name2 | wc -l)
e=$(date +%s%N) name2_perf=$((e-s))
printf "  [# of files] $name2_num [Runtime(ns)] $name2_perf\n\n"

echo \> find \""$dir"\" -not -path \""$dir/prune_me*"\" -exec bash -c \'echo \"\$0\"\' {} \\\; name3 s=$(date +%s%N)
name3_num=$(name3 | wc -l) e=$(date +%s%N)
name3_perf=$((e-s)) printf " [# of files] $name3_num [Runtime(ns)] $name3_perf\n\n"

echo "Cleaning up test files..."
cleanup
134
DimiDak 2018-03-16 00:02.

これは私のために働いた唯一のものです。

find / -name MyFile ! -path '*/Directory/*'

「ディレクトリ」を除く「MyFile」を検索しています。星を強調する*。

61
Joshua 2010-11-18 13:01.

1つのオプションは、grepを使用してディレクトリ名を含むすべての結果を除外することです。例えば:

find . -name '*.js' | grep -v excludeddir
41
mpapis 2010-11-18 13:22.

私は-not表記法を好みます...それはより読みやすいです:

find . -name '*.js' -and -not -path directory
27
Drew Frezell 2010-11-18 13:01.

-pruneオプションを使用します。だから、次のようなもの:

find . -type d -name proc -prune -o -name '*.js'

'-type d -name proc -prune'は、除外するprocという名前のディレクトリのみを検索します。
'-o'は 'OR'演算子です。

22
wisbucky 2017-11-17 14:38.

-prune確実に機能し、除外したいディレクトリに下がるのを防ぐため、最良の答えです。-not -path除外されたディレクトリは引き続き検索されますが、結果は出力されません。これは、除外されたディレクトリがネットワークボリュームにマウントされている場合、または権限がない場合に問題になる可能性があります。

トリッキーな部分はfind、引数の順序に非常にこだわることです。そのため、引数を正しく取得しないと、コマンドが機能しない可能性があります。引数の順序は一般的に次のとおりです。

find {path} {options} {action}

{path}:パスに関連するすべての引数を最初に配置します。 . -path './dir1' -prune -o

{options}-name, -iname, etcこのグループの最後の選択肢として入れると、私は最も成功します。例えば-type f -iname '*.js'

{action}-print使用時に追加する必要があります-prune

これが実際の例です:

# setup test
mkdir dir1 dir2 dir3
touch dir1/file.txt; touch dir1/file.js
touch dir2/file.txt; touch dir2/file.js
touch dir3/file.txt; touch dir3/file.js

# search for *.js, exclude dir1
find . -path './dir1' -prune -o -type f -iname '*.js' -print

# search for *.js, exclude dir1 and dir2
find . \( -path './dir1' -o -path './dir2' \) -prune -o -type f -iname '*.js' -print
16
user1882879 2016-01-19 07:06.

これは、いくつかのパスを除外するために使用した形式です。

$ find ./ -type f -name "pattern" ! -path "excluded path" ! -path "excluded path"

これを使用して、「。*」パスにないすべてのファイルを検索しました。

$ find ./ -type f -name "*" ! -path "./.*" ! -path "./*/.*"
13
Wolfgang Fahl 2017-08-30 18:05.

-path -pruneアプローチは、パス内のワイルドカードでも機能します。これは、複数のgitリポジトリにサービスを提供するgitサーバーのディレクトリを検索してgit内部ディレクトリを除外するfindステートメントです。

find . -type d \
   -not \( -path */objects -prune \) \
   -not \( -path */branches -prune \) \
   -not \( -path */refs -prune \) \
   -not \( -path */logs -prune \) \
   -not \( -path */.git -prune \) \
   -not \( -path */info -prune \) \
   -not \( -path */hooks -prune \)  
12
Istopopoki 2018-03-08 00:20.

良い答えはたくさんありますが、コマンドの各要素の目的とその背後にあるロジックを理解するのに少し時間がかかりました。

find . -path ./misc -prune -o -name '*.txt' -print

findは、現在のディレクトリ内のファイルとディレクトリの検索を開始しますfind .。したがって、。

この-oオプションは論理ORを表し、コマンドの2つの部分を分離します。

[ -path ./misc -prune ] OR [ -name '*.txt' -print ]

ある任意のディレクトリやファイルではない./miscディレクトリが最初のテストに合格しません-path ./misc。ただし、2番目の式に対してテストされます。それらの名前*.txt-printオプションのために印刷されるパターンに対応する場合。

findが./miscディレクトリに到達すると、このディレクトリは最初の式のみを満たします。したがって、-pruneオプションが適用されます。これは、findコマンドにそのディレクトリを探索しないように指示します。したがって、。/ misc内のファイルまたはディレクトリは、findによって探索されることも、式の2番目の部分に対してテストされることも、印刷されることもありません。

10
JBENOIT 2014-03-20 01:03.

複数のディレクトリを除外するには:

find . -name '*.js' -not \( -path "./dir1" -o -path "./dir2/*" \)

ディレクトリを追加するには、以下を追加し-o -path "./dirname/*"ます。

find . -name '*.js' -not \( -path "./dir1" -o -path "./dir2/*" -o -path "./dir3/*"\)

ただし、除外するディレクトリが多数ある場合は、正規表現を使用する必要があります。

8
james dupin 2013-12-10 00:12.

実用的なソリューションの場合(Ubuntu 12.04(Precise Pangolin)でテスト済み)...

find ! -path "dir1" -iname "*.mp3"

dir1サブフォルダを除いて、現在のフォルダとサブフォルダでMP3ファイルを検索します。

使用する:

find ! -path "dir1" ! -path "dir2" -iname "*.mp3"

... dir1とdir2を除外する

7
cycollins 2019-09-04 11:35.

剪定のディレクトリを印刷避けるための良いトリックは使用することです-print(のための作品-execの右側の後だけでなく)を-orした後-prune。例えば、 ...

find . -path "*/.*" -prune -or -iname "*.j2"

拡張子が `.j2"の現在のディレクトリの下にあるすべてのファイルのパスを出力し、すべての隠しディレクトリをスキップします。きちんとしています。ただし、上記のように、スキップしている各ディレクトリのフルパスも出力します。ただし、以下はしません、..。

find . -path "*/.*" -prune -or -iname "*.j2" -print

論理的に-andは、-iname演算子の後と-printの前に隠しがあります。これ-orにより、ブール演算の順序と結合性により、句の右側にバインドされます。しかし、ドキュメントは-print、それ(またはそのいとこのいずれか...-print0など)が指定されていない場合、隠されていると述べています。では、なぜ-or印刷の左側がないのですか?どうやら(そして私が最初にmanページを読んだときからこれを理解していなかった)、それは-print-または-execどこにも存在しない場合に当てはまります。その場合、-printは論理的に散らばって、すべてが印刷されます。printいずれかの句で1つのスタイルの操作でさえ表現されている場合、それらの隠された論理的な操作はすべてなくなり、指定したものだけが取得されます。率直に言って、逆の方がいいかもしれませんが、find説明演算子しかないaはどうやら何もしないので、そのままでは理にかなっていると思います。上記のように、これはすべて-exec同様に機能するため、以下ではls -la、目的の拡張子を持つ各ファイルの完全なリストを示しますが、各隠しディレクトリの最初のレベルはリストしません...

find . -path "*/.*" -prune -or -iname "*.j2" -exec ls -la -- {} +

私(およびこのスレッドの他の人)にとって、find構文はかなりすぐにバロックになるので、私は常に親を投入して、何が何にバインドするかを確実に知っているようにします。したがって、通常、型付き可能性のマクロを作成し、などのすべてのステートメントを形成します。 ..

find . \( \( ... description of stuff to avoid ... \) -prune \) -or \
\( ... description of stuff I want to find ... [ -exec or -print] \)

このように世界を2つの部分に設定することで、間違いを犯すことは困難です。これがお役に立てば幸いです。30番目以上の回答を読んで投票することはまずないようですが、期待することはできます。:-)

6
The Archetypal Paul 2010-11-18 13:01.
find . -name '*.js' -\! -name 'glob-for-excluded-dir' -prune
5
Funkodebat 2014-08-30 10:41.
find -name '*.js' -not -path './node_modules/*' -not -path './vendor/*'

と同じように動作するようです

find -name '*.js' -not \( -path './node_modules/*' -o -path './vendor/*' \)

IMOを覚えやすくなります。

5
Siju V 2015-07-21 17:52.

これを実現するには、プルーニングオプションを使用できます。例のように:

find ./ -path ./beta/* -prune -o -iname example.com -print

または、逆grep「grep-v」オプション:

find -iname example.com | grep -v beta

Linuxのfindコマンドで詳細な手順と例を見つけることができます。検索からディレクトリを除外します

5
supersan 2020-02-28 08:43.

正規表現を使用して、次のようなものを使用して、検索にいくつかのファイルを含めたり除外したりすることもできます。

find . -regextype posix-egrep -regex ".*\.(js|vue|s?css|php|html|json)$" -and -not -regex ".*/(node_modules|vendor)/.*" 

これにより、すべてのjs、vue、cssなどのファイルのみが提供されますが、node_modulesおよびvendorフォルダー内のすべてのファイルは除外されます。

4
Sixro 2013-09-24 08:25.

これまでの答えはどれもUbuntuでは良くありません。これを試して:

find . ! -path "*/test/*" -type f -name "*.js" ! -name "*-min-*" ! -name "*console*"

私はこれをここで見つけました

4
Victoria Stuart 2018-09-28 07:51.

TLDR:-path <excluded_path> -prune -oオプションを使用して、ルートディレクトリを理解し、そこから検索を調整します。/除外されたパスの最後に末尾を含めないでください。

例:

find / -path /mnt -prune -o -name "*libname-server-2.a*" -print


効果的に使用するfindには、ファイルシステムのディレクトリ構造をよく理解することが不可欠だと思います。自宅のコンピューターにはマルチTBのハードドライブがあり、そのコンテンツの約半分はrsnapshot(つまり、rsync)を使用してバックアップされています。物理的に独立した(重複した)ドライブにバックアップしますが、システムのルート(/)ディレクトリの下にマウントされます/mnt/Backups/rsnapshot_backups/::

/mnt/Backups/
└── rsnapshot_backups/
    ├── hourly.0/
    ├── hourly.1/
    ├── ...
    ├── daily.0/
    ├── daily.1/
    ├── ...
    ├── weekly.0/
    ├── weekly.1/
    ├── ...
    ├── monthly.0/
    ├── monthly.1/
    └── ...

/mnt/Backups/rsnapshot_backups/ディレクトリは、現在〜60Mのファイルとフォルダを、〜2.9 TB占めています。これらのコンテンツをトラバースするだけでは時間がかかります。

## As sudo (#), to avoid numerous "Permission denied" warnings:

time find /mnt/Backups/rsnapshot_backups | wc -l
60314138    ## 60.3M files, folders
34:07.30    ## 34 min

time du /mnt/Backups/rsnapshot_backups -d 0
3112240160  /mnt/Backups/rsnapshot_backups    ## 3.1 TB
33:51.88    ## 34 min

time rsnapshot du    ## << more accurate re: rsnapshot footprint
2.9T    /mnt/Backups/rsnapshot_backups/hourly.0/
4.1G    /mnt/Backups/rsnapshot_backups/hourly.1/
...
4.7G    /mnt/Backups/rsnapshot_backups/weekly.3/
2.9T    total    ## 2.9 TB, per sudo rsnapshot du (more accurate)
2:34:54          ## 2 hr 35 min

したがって、/(ルート)パーティションでファイルを検索する必要があるときはいつでも、バックアップパーティションのトラバースに対処する必要があります(可能な場合は避けてください)。


このスレッドでさまざまに提案されているアプローチ(find .commandでディレクトリを除外する方法)の中で、受け入れられた回答を使用した検索の方がはるかに高速であることがわかりました。ただし、注意が必要です。

解決策1

システムファイルを見つけlibname-server-2.aたいが、rsnapshotバックアップを検索したくないとしましょう。すぐにシステムファイルを検索するには、除外するパスを使用する/mnt(すなわち、使用/mnt、いない/mnt/、または/mnt/Backups、または...):

## As sudo (#), to avoid numerous "Permission denied" warnings:

time find / -path /mnt -prune -o -name "*libname-server-2.a*" -print
/usr/lib/libname-server-2.a
real    0m8.644s              ## 8.6 sec  <<< NOTE!
user    0m1.669s
 sys    0m2.466s

## As regular user (victoria); I also use an alternate timing mechanism, as
## here I am using 2>/dev/null to suppress "Permission denied" warnings:

$ START="$(date +"%s")" && find 2>/dev/null / -path /mnt -prune -o \
    -name "*libname-server-2.a*" -print; END="$(date +"%s")"; \ TIME="$((END - START))"; printf 'find command took %s sec\n' "$TIME"
/usr/lib/libname-server-2.a
find command took 3 sec     ## ~3 sec  <<< NOTE!

...わずか数秒でそのファイルを見つけますが、これにははるかに長い時間がかかります(「除外された」すべてのディレクトリを繰り返し処理するよう見えます)。

## As sudo (#), to avoid numerous "Permission denied" warnings:

time find / -path /mnt/ -prune -o -name "*libname-server-2.a*" -print
find: warning: -path /mnt/ will not match anything because it ends with /.
/usr/lib/libname-server-2.a
real    33m10.658s            ## 33 min 11 sec (~231-663x slower!)
user    1m43.142s
 sys    2m22.666s

## As regular user (victoria); I also use an alternate timing mechanism, as
## here I am using 2>/dev/null to suppress "Permission denied" warnings:

$ START="$(date +"%s")" && find 2>/dev/null / -path /mnt/ -prune -o \ -name "*libname-server-2.a*" -print; END="$(date +"%s")"; \
    TIME="$((END - START))"; printf 'find command took %s sec\n' "$TIME"
/usr/lib/libname-server-2.a
find command took 1775 sec    ## 29.6 min

解決策2

このスレッドで提供されている他のソリューション(SO#4210042)もパフォーマンスが低下します。

## As sudo (#), to avoid numerous "Permission denied" warnings:

time find / -name "*libname-server-2.a*" -not -path "/mnt"
/usr/lib/libname-server-2.a
real    33m37.911s            ## 33 min 38 sec (~235x slower)
user    1m45.134s
 sys    2m31.846s

time find / -name "*libname-server-2.a*" -not -path "/mnt/*"
/usr/lib/libname-server-2.a
real    33m11.208s            ## 33 min 11 sec
user    1m22.185s
 sys    2m29.962s

まとめ| 結論

ソリューション1」に示されているアプローチを使用します

find / -path /mnt -prune -o -name "*libname-server-2.a*" -print

すなわち

... -path <excluded_path> -prune -o ...

/除外されたパスに末尾を追加するたびに、findコマンドは(それらすべての)/mnt/*ディレクトリに再帰的に入力することに注意してください。私の場合、/mnt/Backups/rsnapshot_backups/*サブディレクトリがあるため、検索するファイルが最大2.9TB含まれています。末尾を追加しないことにより/、検索はほぼ即座に(数秒以内に)完了するはずです。

「Solution2」(... -not -path <exclude path> ...)も同様に、除外されたディレクトリを再帰的に検索しているように見えます。除外された一致は返されませんが、その検索時間が不必要に消費されます。


それらのrsnapshotバックアップ内の検索:

私の毎時/毎日/毎週/毎月のrsnapshotバックアップの1つでファイルを見つけるには):

$ START="$(date +"%s")" && find 2>/dev/null /mnt/Backups/rsnapshot_backups/daily.0 -name '*04t8ugijrlkj.jpg'; END="$(date +"%s")"; TIME="$((END - START))"; printf 'find command took %s sec\n' "$TIME"
/mnt/Backups/rsnapshot_backups/daily.0/snapshot_root/mnt/Vancouver/temp/04t8ugijrlkj.jpg
find command took 312 sec   ## 5.2 minutes: despite apparent rsnapshot size
                            ## (~4 GB), it is in fact searching through ~2.9 TB)

ネストされたディレクトリを除外する:

ここで、私は、ネストされたディレクトリ、例えばを除外したい/mnt/Vancouver/projects/ie/claws/data/*から検索するとき/mnt/Vancouver/projects/

$ time find . -iname '*test_file*'
./ie/claws/data/test_file
./ie/claws/test_file
0:01.97

$ time find . -path '*/data' -prune -o -iname '*test_file*' -print
./ie/claws/test_file
0:00.07

余談:-printコマンドの最後に追加すると、除外されたディレクトリの出力が抑制されます。

$ find / -path /mnt -prune -o -name "*libname-server-2.a*"
/mnt
/usr/lib/libname-server-2.a

$ find / -path /mnt -prune -o -name "*libname-server-2.a*" -print
/usr/lib/libname-server-2.a
4
Richard Gomes 2020-05-30 01:01.
find . \( -path '.**/.git' -o -path '.**/.hg' \) -prune -o -name '*.js' -print

上記の例*.jsでは、フォルダ.gitとを除く現在のディレクトリの下にあるすべてのファイルが検索されますが、.hgこれら.git.hgフォルダの深さは関係ありません。

注:これも機能します:

find . \( -path '.*/.git' -o -path '.*/.hg' \) -prune -o -name '*.js' -print

しかし、私は**ここでトピックから外れる他のいくつかのツールとの一貫性のために表記法を好みます。

3
Lemmings19 2013-05-31 06:56.

findのファイルのリストを提供するために使用してxgettextいましたが、特定のディレクトリとその内容を省略したいと思いました。と-path組み合わせて多くの順列を試しましたが、削除し-pruneたいディレクトリを完全に除外できませんでした。

無視したいディレクトリの内容を無視することはできましたfindが、結果の1つとしてディレクトリ自体を返しxgettextたため、結果としてクラッシュしました(ディレクトリを受け入れず、ファイルのみ)。

私の解決策はgrep -v、結果に表示したくないディレクトリをスキップするために使用することでした。

find /project/directory -iname '*.php' -or -iname '*.phtml' | grep -iv '/some/directory' | xargs xgettext

findそれが100%うまくいくという議論があるかどうかは定かではありません。grepいくつかの頭痛の後、使用は迅速かつ簡単な解決策でした。

3
jiahut 2015-03-18 21:56.

これはMacの私に適しています:

find . -name *.php -or -path "./vendor" -prune -or -path "./app/cache" -prune

それは除外されますvendorapp/cache接尾辞検索名にはdir php

3
JaredTS486 2017-11-17 09:56.

-pathまたは-notを使用できない古いバージョンのUNIXを使用している

SunOS 5.10 bash3.2およびSunOS5.11 bash4.4でテスト済み

find . -type f -name "*" -o -type d -name "*excluded_directory*" -prune -type f
2
go2null 2015-01-27 08:17.

how-to-use-prune-option-of-find-in-shは、LaurenceGonsalvesによる仕組みに関する優れた回答-pruneです。

そして、ここに一般的な解決策があります:

find /path/to/search                    \
  -type d                               \
    \( -path /path/to/search/exclude_me \
       -o                               \
       -name exclude_me_too_anywhere    \
     \)                                 \
    -prune                              \
  -o                                    \
  -type f -name '*\.js' -print

/path/to/seach/複数回入力しないようにするにfindは、をpushd .. popdペアでラップします。

pushd /path/to/search;                  \
find .                                  \
  -type d                               \
    \( -path ./exclude_me               \
       -o                               \
       -name exclude_me_too_anywhere    \
     \)                                 \
    -prune                              \
  -o                                    \
  -type f -name '*\.js' -print;         \
 popd
2
adrianTNT 2018-03-28 00:26.

私が必要としていたものについてはlandscape.jpg、ルートから開始して/varディレクトリ内の検索を除外して、すべてのサーバーで次のように機能しました。

find / -maxdepth 1 -type d | grep -v /var | xargs -I '{}' find '{}' -name landscape.jpg

find / -maxdepth 1 -type d lists all directories in /

grep -v /var excludes `/var' from the list

xargs -I '{}' find '{}' -name landscape.jpg execute any command, like find with each directory/result from list

2
EIIPII 2020-02-26 05:29.

The following commands works:

find . -path ./.git -prune -o -print

If You have a problem with find, use the -D tree option to view the expression analysis information.

find -D tree . -path ./.git -prune -o -print

Or the -D all, to see all the execution information.

find -D all . -path ./.git -prune -o -print
1
Ivan Ivanovich 2015-04-23 00:47.

I found the functions name in C sources files exclude *.o and exclude *.swp and exclude (not regular file) and exclude dir output with this command:

find .  \( ! -path "./output/*" \) -a \( -type f \) -a \( ! -name '*.o' \) -a \( ! -name '*.swp' \) | xargs grep -n soc_attach
1
Alberto 2015-08-28 22:25.

Better use the exec action than the for loop:

find . -path "./dirtoexclude" -prune \
    -o -exec java -jar config/yuicompressor-2.4.2.jar --type js '{}' -o '{}' \;

The exec ... '{}' ... '{}' \; will be executed once for every matching file, replacing the braces '{}' with the current file name.

Notice that the braces are enclosed in single quote marks to protect them from interpretation as shell script punctuation*.


Notes

* From the EXAMPLES section of the find (GNU findutils) 4.4.2 man page

Related questions

MORE COOL STUFF

「水曜日」シーズン1の中心には大きなミステリーがあります

「水曜日」シーズン1の中心には大きなミステリーがあります

Netflixの「水曜日」は、典型的な10代のドラマ以上のものであり、実際、シーズン1にはその中心に大きなミステリーがあります.

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンが、オリビア・ワイルドが彼女とハリー・スタイルズとの間の「難しい」が「非常に友好的」な分割を恒久的にすることを望んでいる理由を見つけてください.

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする&nbsp;

エリザベス女王の死後、ケイト・ミドルトンが舞台裏で「非常に困難な時期」を過ごしていたと伝えられている理由を調べてください.

ウィリアム王子は「非常に現代的なお父さん」だと王室の専門家は言う

ウィリアム王子は「非常に現代的なお父さん」だと王室の専門家は言う

ある王室の専門家が、特に彼の家族の他の王室の両親と比較して、ウィリアム王子が「非常に現代的な父親」であると考える理由を学びましょう.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

都市伝説:ディズニーランドで生まれた赤ちゃんが生涯パスを取得

都市伝説:ディズニーランドで生まれた赤ちゃんが生涯パスを取得

1979年7月4日、小さなテレササルセドは、カリフォルニアのディズニーランドで生まれた最初の赤ちゃんでした。しかし、都市伝説に反して、彼女は地球上で最も幸せな場所への生涯パスを取得しませんでした。

VWが34州のウォルマートに「超高速」電気充電ステーションを設置

VWが34州のウォルマートに「超高速」電気充電ステーションを設置

Electrify Americaの一部としてのVWの新しい充電器ディーゼルゲートスキャンダルの悔い改めを求めるフォルクスワーゲンの継続的な努力の一環として、ドイツの自動車メーカーは電気自動車に数十億ドルを投資しています。これには、水曜日に、2019年半ばまでに34州の100を超えるウォルマート店舗に「超高速」電気自動車充電器を設置するという新しい発表が含まれています。

ニューヨーク市は最終的に彼らの性同一性に従って受刑者を収容する

ニューヨーク市は最終的に彼らの性同一性に従って受刑者を収容する

ライカーズ島の刑務所複合施設。ニューヨーク市は、性同一性に応じて受刑者の住居を始めることを計画している、とオブザーバーは報告している。

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、子供向けのパズルの本の序文を書き、ジョージ王子、シャーロット王女、ルイ王子と一緒にテキストを読むと述べた.

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

Yak's Produce は、数十個のつぶれたメロンを野生動物のリハビリ専門家であるレスリー グリーンと彼女のルイジアナ州の救助施設で暮らす 42 匹の動物に寄付しました。

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

8 枚目のスタジオ アルバムのリリースに向けて準備を進めているデミ ロヴァートは、「スーパー グレート ガイ」と付き合っている、と情報筋は PEOPLE に確認しています。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

ホームオフィスのセットアップ術を極めよう!AppExert の開発者は、家族全員が一緒にいる場合でも、在宅勤務の技術を習得しています。祖父や曽祖父が共同家族で暮らしていた頃の記憶がよみがえりました。

2022 年、私たちのデジタル ライフはどこで終わり、「リアル ライフ」はどこから始まるのでしょうか?

20 年前のタイムトラベラーでさえ、日常生活におけるデジタルおよびインターネットベースのサービスの重要性に驚くことでしょう。MySpace、eBay、Napster などのプラットフォームは、高速化に焦点を合わせた世界がどのようなものになるかを示してくれました。

ニューロマーケティングの秘密科学

ニューロマーケティングの秘密科学

マーケティング担当者が人間の欲望を操作するために使用する、最先端の (気味が悪いと言う人もいます) メソッドを探ります。カートをいっぱいにして 3 桁の領収書を持って店を出る前に、ほんの数点の商品を買いに行ったことはありませんか? あなたは一人じゃない。

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

私たちが住んでいる世界を確実に理解するには、データが必要です。ただし、空間参照がない場合、このデータは地理的コンテキストがないと役に立たなくなる可能性があります。

Language