注文する:
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
仕組み:
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
-
xargs
オプションとパラメータ-0
NULで区切られた入力を期待するようにxargsに指示します。-r
1 つ以上のファイルが見つからない場合は、コマンドを実行しないように xargs に指示します。 (このオプションはBSDまたはOSXでは必要ではなく、OSXと互換性がありませんxargs
。)cp -t /path/to/dest
ディレクトリを宛先ディレクトリにコピーします。 (-t
GNUが必要です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オプションについて