2017-12-06 28 views
-2

ディレクトリ内のファイルのリストの中からファイルの特定のフォーマットを選択します。以下の例を見てください。フォルダ内の特定のファイルを選択してください

私は以下のファイルリスト(6ファイル)を持っています。

セット1
1)MAG_L_NT_AA_SUM_2017_01_20.dat
2)MAG_L_NT_AA_2017_01_20.dat

セット-2
1)MAG_L_NT_BB_SUM_2017_01_20.dat
2)MAG_L_NT_BB_2017_01_20.dat

セット3
1)MAG_L_NT_CC_SUM_2017_01_20.dat
2)MAG_L_NT_CC_2017_01_20.dat

上記の3つのセットから、私は3つのファイルしか必要としません。
1)MAG_L_NT_AA_2017_01_20.dat
2)MAG_L_NT_BB_2017_01_20.dat
3)MAG_L_NT_CC_2017_01_20.dat

注:私は上記REQのためのスクリプトを作成しているので、コマンドの複数の行が存在し得ます。おかげで、あなたの問題におそらく最も簡単かつ最も複雑なソリューションは、とgrep(パターンと一致する行を印刷するためのツール)(ディレクトリ階層内のファイルを検索するためのツールfindを組み合わせている

答えて

0

man findman grepと入力して、これらのツールのマニュアルを読むこともできます。

解決策に直接進む前に、問題をどのように解決するかを理解する必要があります。一致する

-nameパターンファイル名(削除有数のディレクトリとパス)の

ベース:我々はオプション-namefindコマンドを使用します検索したファイルの名前でパターンを検索するにはシェルパターンパターン。メタ文字( '*'、 '?'、 '[]') は 'と一致します。 (これは のfindutils-4.2.2の変更です;以下の「標準の準拠」セクションを参照してください)。 ディレクトリとその下のファイルを無視するには、-pruneを使用します。 -pathの説明の の例を参照してください。中括弧は特別な意味を持ちません。 シェルパターンに特別な意味を持つ というBashインブルーブレースを含むいくつかのシェルがあるにもかかわらず、中括弧は特別なものとして認識されません。ファイル名の一致はfnmatch(3)ライブラリ関数を使用して で実行されます。シェルを で展開しないようにするには、 のパターンを引用符で囲むことを忘れないでください。例えば

我々は'words_directory'というディレクトリ内の文字列を含むファイル「ABC」を検索したい場合は、我々は次のように入力します:

$ find words_directory -name "*abc*" 

そして、我々はディレクトリ内のすべてのディレクトリを検索したい場合は:これ文字列"MAG_L_NT_"を開始し、で終わる

$ find words_directory/* -name "*abc*" 

だからまず、我々は、すべてのファイルを検索する必要があります。でそこに来て、

$ find /your/specified/path/* -name "MAG_L_NT_*.dat" 

は、しかし、これがすべて見つかったファイル名を出力しますが、我々はまだ"SUM"文字列を含む名前を取得:は、したがって、このパターンに一致するファイルが含まれている可能性があり、多くのサブディレクトリが含まれてい/your/specified/path/に一致するすべての名前を検索しますgrep。非一致した行を選択するには、--invertマッチ

反転マッチングの感覚、

-v:不要な文字列を含む名前を除外するために、我々はオプション-vを使用します。 (-vは、POSIXで が指定されている。)

は、フィルタリングするのgrepを使用するには、まず私たちが使用する出力コマンド()|

パイプラインのための標準的なシェルの構文は、複数のコマンドを一覧表示することである

、 は垂直バーで区切られています(一般的なUnixの言葉では "パイプ")。 の場合、現在のディレクトリ(ls)のファイルを一覧表示するには、文字列 "key"(grep)を含む 行のls出力のみを保持し、 の結果をスクロールページ(less)に表示すると、端末の コマンドラインに次

ls -l | grep key | less 

「LSの-l」はプロセス、出力(stdout)その にパイプさを生成する「grepのキー」のためのプロセスの入力(STDIN) ;同様に、「less」のプロセスについては です。各プロセスは前のプロセス からの入力を受け取り、標準ストリームを介して次のプロセスの出力を生成します。それぞれ "|"シェルは、 のコマンドの標準出力を、オペレーティングシステムで実装されている プロセス間通信機構(匿名)の というパイプによって、右側のコマンドの標準入力に接続するように指示します。パイプは単方向です。データ がパイプラインを左から右へ流れます。

process1 | process2 | process3 

あなたがあなたの目標を達成するために使用されているコマンドとオプションに知り合った後、あなたが解決策の準備ができている:

$ find /your/specified/path/* -name "MAG_L_NT_*.dat" | grep -v "SUM" 

このコマンドは始まるすべての名前の出力を生成します"MAG_L_NT_"と ".dat"で終わります。grep -vは、最初のコマンド出力を入力として使用し、"SUM"文字列を含むすべての行を削除します。

+0

おかげさまで – sudheer113

+0

@ sudheer113、もし私があなたの質問に答えたら[正しい答えをマークする](https://stackoverflow.com/help/someone-answers)、またコメント欄が専用です問題を話すために、答えに感謝しないで(あなたはupvotingに感謝することができます)。一般的なルール[there](https://stackoverflow.com/help/asking)の詳細を読む。 – Lycopersicum

関連する問題