4

たとえば、grep ツールで検索するファイルのセットを指定するために、ツリー構造でファイルを指定する例を探しています。名前の一致によってファイルとディレクトリを含めたり除外したりできるようにしたいと思います。そこに例があると確信していますが、それらを見つけるのに苦労しています。

考えられる構文の例を次に示します。

*.py *.html
*.txt *.js
-*.pyc
-.svn/
-*combo_*.js

(これは、拡張子 .py .html .txt .js を持つファイルをインクルードし、.pyc ファイル、.svn ディレクトリの下にあるもの、combo_ .js に一致するすべてのファイルを除外することを意味します)

この種の仕様は以前に他のツールで見たことがあります。これは誰かにとって何か鐘を鳴らしていますか?

4

7 に答える 7

4

この種のものには単一の標準形式はありませんが、広く認識されているものをコピーしたい場合は、rsyncドキュメントをご覧ください。「INCLUDE/EXCLUDE PATTERN RULES」の章を見てください。

于 2008-12-27T01:01:29.833 に答える
2

Apache Antは、次のような 'ant グロブまたはパターンを提供します。

**/foo/**/*.java

「パスに「foo」という名前のディレクトリを含むディレクトリ内の「.java」で終わるすべてのファイル」を意味します-./foo/X.javaを含みます

于 2008-12-26T23:06:58.160 に答える
1

findunixish 環境ではどうですか?

もちろん、Find はファイルのリストを作成する以上のことを行うことができますが、これは一般的な使用方法の 1 つです。マニュアルページから:

NAME find -- ファイル階層をたどる

概要 find [-H | -L | -P] [-EXdsx] [-f パス名] パス名 ... 式検索 [-H | -L | -P] [-EXdsx] -f パス名 [パス名 ...] 式

説明 find ユーティリティは、リストされた各パス名のディレクトリ ツリーを再帰的に下降 primaries'' andし、ツリー内の各ファイルに関して (以下にリストされたオペランドで構成された) 式を評価します。

あなたの目標を達成するために、私は次のように書きます(読みやすいようにフォーマットされています):

find ./ \( -name *.{py,html,txt,js,pyc} -or \
           -name *combo_*.js -or \
           \( -name *.svn -and -type d\)\) \
           -print

xargsさらに、次のように構築されたリスト全体を任意のコマンドに送信するのに find を適したものにする、idotic パターン usingがあります。

find /path -type f -print0 | xargs -0 rm
于 2008-12-26T22:06:25.630 に答える
1

あなたの例の構文では、ダッシュで始まるファイルを明示的に含めることができるように、エスケープ文字があることが暗黙的に理解されていますか? (同じ質問が他のワイルドカード文字にも当てはまりますが、名前にアスタリスクよりもダッシュが含まれているファイルの方が多いと思います。)

あなたの例のように、さまざまなコマンド シェルが * (および場合によっては ? を単一の文字と一致させるために) を使用しますが、通常は、パス コンポーネントの区切り文字 (つまり、Windows システムでは '\'、' /' 他の場所)。また、Perforce などのソース管理アプリが、パス コンポーネントの区切り記号と照合できる追加のパターンを使用しているのを見てきました。たとえば、Perforce では、パターン "foo/...ext" (引用符なし) は、foo/ ディレクトリ構造の下にあり、"ext" で終わるすべてのファイルに一致します。子孫ディレクトリ。これは便利なパターンのようです。

于 2008-12-26T23:10:37.170 に答える
1

bash を使用している場合は、extglob拡張機能を使用して便利なグロビング関数を取得できます。次のように有効にします。

shopt -s extglob

次に、次のようなことができます。

# everything but .html, .jpg or ,gif files
ls -d !(*.html|*gif|*jpg)
# list file9, file22 but not fileit
ls file+([0-9])
# begins with apl or un only
ls -d +(apl*|un*)

このページも参照してください。

于 2008-12-27T01:14:28.480 に答える
0

find(1)前の回答で説明したように優れたツールですが、より複雑になる場合は、通常の疑わしいもの (Ruby、Perl、Python など) で独自のスクリプトを作成するか、より強力なツールのいずれかを使用することを検討する必要があります。グロビングコマンドを備えたzshなどのシェルで**、除外するものを指定できます。ただし、後者はおそらくより複雑です。

于 2008-12-26T22:17:50.193 に答える
0

ackなどのオプションを使用して検索するファイルの種類を指定できるackを確認することをお勧めします。--perl

また.svn、デフォルトでディレクトリを無視し、コア ダンプ、編集者の手抜き、バイナリ ファイルなども無視します。

于 2008-12-27T00:51:46.250 に答える