GNU/Linux >> Linux の 問題 >  >> Linux

ファイル内の単語をGrepしてから、ファイルをコピーしますか?

ファイルのコレクション(* .zip、*。txt、*。tar.gz、*。doc、…etc)があります。これらのファイルはパス内にあります。すべてのファイル(* .txt)を検索し、特定の単語(LINUX / UNIXなど)を含むテキストファイルのみをコピーしたい。

私は次のことを実行しました:

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

このコマンドはすべてのテキストファイルを見つけることができ、「grep」は「LINUX / UNIX」を含むテキストファイルのみをリストすることにより、結果のテキストファイルをフィルタリングしました。

これらの最終ファイル(つまり、「LINUX / UNIX」を含むテキストファイル)を選択した特定のパスにコピーするにはどうすればよいですか?

xargsを適用しようとしました

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

しかし、うまくいきませんでした

承認された回答:

試してみてください:

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

このコマンドはNUL区切りを使用するため、空白、タブ、さらには改行を含む難しい名前のファイルを含むすべてのファイル名に対して安全です。

上記にはGNUcpが必要です 。 MacOS / FreeBSDの場合は、次を試してください。

grep -rl --null --include '*.txt' LINUX/UNIX . | xargs -0 sh -c 'cp "[email protected]" /path/to/dest' sh

仕組み:

  1. grep オプションと引数

    • -r ディレクトリ構造を再帰的に検索するようにgrepに指示します。 (FreeBSDでは、 -r ディレクトリへのシンボリックリンクをたどります。これは、OS/Xまたは最近のバージョンのGNUgrepには当てはまりません。 。)

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

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

    • -null ファイル名を区切るためにNUL文字を使用するようにgrepに指示します。 (-null grepでサポートされています GNU / Linux、MacOS、FreeBSDではではありません OpenBSD。)

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

    • 現在のディレクトリを検索します。 GNU grepの最近のバージョンでは省略できます 、ただし、-を渡す必要があります cpへのオプションターミネータ -で始まるファイル名を防ぐため 。

  2. xargs オプションと引数

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

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

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


Linux
  1. ファイル内の複数の文字列のGrepを実行し、サイズ順にファイルを一覧表示しますか?

  2. Linuxで最高のファイル転送ツール

  3. LinuxでRsyncコマンドを使用するにはどうすればよいですか?

  1. Linuxターミナルでファイルをコピーする

  2. Linuxターミナルでファイルを移動する

  3. 巨大なログ ファイル (>14 GB) で最後の x GB のみを grep しますか?

  1. Ansibleガイド:Ansibleを使用してファイルを管理する

  2. 「猫」の出力で単語を強調表示する方法は??

  3. シェル内の複数のファイルにパイプしますか?