ファイルの単語を把握してからファイルをコピーしてください。

ファイルの単語を把握してからファイルをコピーしてください。

ファイルコレクション(*.zip、*.txt、*.tar.gz、*.doc、...など)があります。これらのファイルはパスにあります。すべてのファイル(* .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>

しかし成功はありません。

ベストアンサー1

努力する:

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

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

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

grep -rl --null --include '*.txt' LINUX/UNIX . | 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 に指示します。 (--null応募者:grepGNU/LinuxアップルシステムそしてFreeBSDしかし、いいえ オープンBSD.)

    • 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。)

おすすめ記事