ファイルのコレクション(* .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
仕組み:
-
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
へのオプションターミネータ-
で始まるファイル名を防ぐため 。
-
-
xargs
オプションと引数-
-0
xargsにNULで区切られた入力を期待するように指示します。 -
-r
少なくとも1つのファイルが見つからない限り、コマンドを実行しないようにxargsに指示します。 (このオプションはBSDまたはOSXのいずれにも必要ではなく、OSXのxargs
と互換性がありません 。) -
cp -t / path / to / dest
ディレクトリをターゲットディレクトリにコピーします。 (-t
GNUcp
が必要です 。)
-