ファイルのコレクションがあります(* .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区切りを使用するため、空白、タブ、または改行を含む難しい名前のファイルを含むすべてのファイル名で安全です。
上記にはGNU cp
が必要です。MacOS/ FreeBSDの場合は、次を試してください。
grep -rl --null --include '*.txt' LINUX/UNIX . | xargs -0 sh -c 'cp "$@" /path/to/dest' sh
使い方:
grep
オプションと引数
-r
は、ディレクトリ構造全体を再帰的に検索するようにgrepに指示します。 (FreeBSDでは、-r
はシンボリックリンクをたどってディレクトリに移動します。これは、OS/XまたはGNU grep
の最近のバージョンのいずれにも当てはまりません。)
--include '*.txt'
は、グロブ*.txt
(.foo.txt
や.txt
などの非表示のものも含む)に一致する名前のファイルのみを返すようにgrepに指示します。
-l
は、一致自体ではなく、一致するファイルの名前のみを返すようにgrepに指示します。
--null
は、NUL文字を使用してファイル名を区切るようにgrepに指示します。 (--null
は GNU/Linux 、 MacOS および FreeBSD でgrep
によってサポートされていますが、notOpenBSD 。)
LINUX/UNIX
は、内容に正規表現が含まれるファイルのみを検索するようにgrepに指示しますLINUX/UNIX
.
現在のディレクトリを検索します。 GNU grep
の最近のバージョンでは省略できますが、保護するにはcp
に--
オプションターミネータを渡す必要があります-
で始まるファイル名に対して。
xargs
オプションと引数
-0
は、xargsにNUL区切りの入力を期待するように指示します。
-r
は、少なくとも1つのファイルが見つからない限り、コマンドを実行しないようにxargsに指示します。 (このオプションはBSDとOSXのどちらにも必要なく、OSXのxargs
と互換性がありません。)
cp -t /path/to/dest
は、ディレクトリをターゲットディレクトリにコピーします。 (-t
にはGNU cp
が必要です。)
より移植性の高い(POSIX機能のみ):
find . -type f -name '*.txt' -exec grep -q LINUX/UNIX {} \; -exec cp {} /path/to/dest \;
次のsh/Bashの1つのライナーは別の方法ですが、現在のディレクトリでのみ機能し、再帰しません。
for f in ./*.txt; do if grep -l 'LINUX/UNIX' "$f"; then cp "$f" /path/to/dest/; fi; done
-l
grepのオプションは、コピーされているファイルのリストを出力しますが、-q
画面に何も表示したくない場合。
元の文字列が機能しなかった理由がわかりません。次のコマンドは私のために働きます。
検索/ -name(ファイル名*)| grep '(filename.extention)' | xargs cp -t ./
私の場合、filename *は同じ名前のファイルのコレクションで、異なるファイルタイプ(txt、Zipなど)です。 grepを実行して、filename.txtだけを見つけ、それを宛先ディレクトリー(現在は./)にコピーします。