JOHN1024のXARGSソリューション

JOHN1024のXARGSソリューション

注文する:

grep -rl "KORD" ./

ディレクトリを検索し、ファイルの内容(タイトル以外)に「KORD」を含むファイルのリストを返します。

Users-MacBook-Air:myPhotorec user$ grep -rl "KORD" ./
.//output_apikey.txt
.//recup_dir.17/f13470392.txt
.//recup_dir.49/f45361992.txt
.//recup_dir.49/f45362424.txt
.//recup_dir.53/f48768408.txt
.//recup_dir.53/f49295480.txt

出力ファイルのリストをコンソールに印刷し、各ファイルをディレクトリ( ./ORD )にコピーするようにgrepコマンドを拡張するデフォルトコマンド(xargs?)はありますか?

私は「猫が皮をむく」方法がいくつかあると思います。 1つ以上の解決策があることを期待しています。

JOHN1024のXARGSソリューション

重複したタグのため、編集された投稿は回答として公開されません。

努力する:

grep -rl --null --include '*.txt' KORD . | xargs -0r cp -t /path/to/dest

このコマンドはNUL区切りを使用するため、スペース、タブ、または改行文字を含む複雑な名前を含むすべてのファイル名に対して安全です。

上記の作業にはGNUが必要ですcp。 BSD/OSX の場合は、以下を試してください。

grep -rl --null --include '*.txt' KORD . | xargs -0 sh -c 'cp "$@" /path/to/dest' sh

仕組み:

  1. grepオプションとパラメータ

    • -rディレクトリ構造から再帰的に検索するように grep に指示します。 (FreeBSDでは-rディレクトリへのシンボリックリンクが続きます。OS / Xや最新バージョンのGNUではありませんgrep。)

    • --include '*.txt'名前がglobと一致するファイル(または*.txt同じ隠しファイルを含む)のみを返すようにgrepに指示します。.foo.txt.txt

    • -l一致するファイル自体ではなく、一致するファイルの名前のみを返すようにgrepに指示します。

    • --nullファイル名を区別するために NUL 文字を使用するよう grep に指示します。

    • LINUX/UNIX内容に正規表現を含むファイルのみを検索するようにgrepに指示するLINUX/UNIX

    • .現在のディレクトリから検索します。最新バージョンのGNUではこれを省略できますが、で終わらないようにするには、オプションの終端を渡すgrep必要があります。--cp-

  2. xargsオプションとパラメータ

    • -0NULで区切られた入力を期待するようにxargsに指示します。

    • -r1 つ以上のファイルが見つからない場合は、コマンドを実行しないように xargs に指示します。 (このオプションはBSDまたはOSXでは必要ではなく、OSXと互換性がありませんxargs。)

    • cp -t /path/to/destディレクトリを宛先ディレクトリにコピーします。 (-tGNUが必要ですcp。)

答え1

find . -type f -exec grep -q 'KORD' {} ';' -exec cp {} ./ORD ';'

現在のディレクトリ内または下のすべての一般ファイルを探します。grep -q 'KORD'各ファイルで実行され、一致する行を含むファイルがディレクトリにコピーされます./ORD

GNU coreutilsがインストールされている場合は、少し効率的に使用できます。

find . -type f -exec grep -q 'KORD' {} ';' -exec cp -t ./ORD {} +

また見なさい:「find」の-execオプションについて

関連情報