このスクリプトに基づいています。
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
。
パターンを次のように解釈します-F
。grep
ひも正規表現ではなく、これはコマンドが少し速くなる可能性がありますが、文字を特別に処理せずに*this*
文字列を検索することを心配する必要がないという意味でもあります*
(正規表現では特別なためです)。
両方のコマンドは、関連付けられたファイルデータを名前付きファイルに書き込みますmyfile
。ファイルがすでに存在する場合は切り捨てられ(空になり)、そうでなければ作成されます。意図的に出力ファイル名を選択しました。いいえfind
コマンド、つまり終わらないコマンドで見つけることができます.txt
。
現在の質問には、find
withの出力をフィルタリングしgrep
てからcp
viaを呼び出すコードが含まれています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
.txt
find
これは、名前がfromで終わるファイルの最初のパス名のリストをxargs
nullで区切られたリストに渡します。ユーティリティはそれをxargs
呼び出し、一致を含むファイルのパス名を空の区切りリストに戻します。これにより、一致するファイルのパス名が出力され、改行で区切られたリストではなく空白で区切られたリストに変換されます。grep
grep
-l
-Z
その後、各ファイルに対してxargs
呼び出される最終関数はこのリストを読み取ります。以前のようにcat
接続結果を作成します。myfile
これは問題を解決するより厄介な方法です。パイプラインステップ間のファイルリストの形式を忘れてしまう可能性があり、コードを実行している人がGNUシステムまたは少なくともGNUツール(ポータブルではないなど)。