文字列を含むファイルを1つの文書にまとめる

文字列を含むファイルを1つの文書にまとめる

このスクリプトに基づいています。

find . -name "*.txt" | grep 'LINUX/UNIX'

そして

find . -name "*.txt" | grep 'LINUX/UNIX' | xargs cp <to a path>

~からここ 、特定の文字列を検索するファイルをgrepし、その文字列が含まれている場合は、ディレクトリにコピーして別のファイルとして保存できます。これらのファイルを一貫した文書としてどのように構成しますか?

私のアイデアの例は次のとおりです。数百のフォルダに別々のファイルとして配布された引用アーカイブがあり、フォルダ名はそのトピックです。したがって、「philosophy/ontology/concepts/aletheia/notes.tex」には、aletheiaなどの哲学的概念に関するすべてのメモが含まれています。

すべていくつかの命名規則(名前は常にNotes.tex)に従うので、grepは簡単です。私はそれらを見つけることができますが、それらを見つけるだけでなく、その文字列を含むすべてのファイルを1つの大きなファイルにリンクするスクリプトを持ちたいです。

ベストアンサー1

*.txt現在のディレクトリまたは特定のディレクトリを含む次のディレクトリから、名前が一致する一般ファイルを選択します。ひも(特定の正規表現に一致するものはありません)これらのファイルを見つけた順序でリンクするには、次のようにします。

find . -name '*.txt' -type f -exec grep -q -F 'LINUX/UNIX' {} \; -exec cat {} + >myfile

または

find . -name '*.txt' -type f -exec sh -c '
    for pathname do
        grep -q -F "LINUX/UNIX" "$pathname" && cat "$pathname"
    done' sh {} + >myfile

grep ここでは、ユーティリティとその-qオプションが使用されます。これは何も出力しませんが、与えられたパターンが一致した場合、「成功」を示すゼロ終了状態で終了します。文字列を含むファイルのみを選択するためのテストとして、上記の2つのコマンドでこの終了ステータスを使用しますLINUX/UNIX

パターンを次のように解釈します-Fgrepひも正規表現ではなく、これはコマンドが少し速くなる可能性がありますが、文字を特別に処理せずに*this*文字列を検索することを心配する必要がないという意味でもあります*(正規表現では特別なためです)。

両方のコマンドは、関連付けられたファイルデータを名前付きファイルに書き込みますmyfile。ファイルがすでに存在する場合は切り捨てられ(空になり)、そうでなければ作成されます。意図的に出力ファイル名を選択しました。いいえfindコマンド、つまり終わらないコマンドで見つけることができます.txt


現在の質問には、findwithの出力をフィルタリングしgrepてからcpviaを呼び出すコードが含まれていますxargs。これはユーザー自身のコードには問題がなく、いくつかの問題があります。 1つの問題は、ファイルの内容をリンクしないことであり、もう1つの問題は、ファイルの内容ではなくgrep出力のパス名に適用されることです。findまた、見ることができます検索結果を繰り返すのはなぜ悪い習慣ですか?これは関連しています。

問題のコード形式を使用して実際に問題を解決してください。これ問題は、findパス名のリストを作成してからgrep関心のあるパス名を選択し、最後に以下を実行することですcat

find . -name '*.txt' -type f -print0 |
xargs -0 grep -lZ -F 'LINUX/UNIX' |
xargs -0 cat >myfile

.txtfindこれは、名前がfromで終わるファイルの最初のパス名のリストをxargsnullで区切られたリストに渡します。ユーティリティはそれをxargs呼び出し、一致を含むファイルのパス名を空の区切りリストに戻します。これにより、一致するファイルのパス名が出力され、改行で区切られたリストではなく空白で区切られたリストに変換されます。grepgrep-l-Z

その後、各ファイルに対してxargs呼び出される最終関数はこのリストを読み取ります。以前のようにcat接続結果を作成します。myfile

これは問題を解決するより厄介な方法です。パイプラインステップ間のファイルリストの形式を忘れてしまう可能性があり、コードを実行している人がGNUシステムまたは少なくともGNUツール(ポータブルではないなど)。

おすすめ記事