見つかった各ファイルを別のWebサーバーのディレクトリにコピーしている間に、特定のパターンと日付に一致するファイルをどのように見つけることができますか?

見つかった各ファイルを別のWebサーバーのディレクトリにコピーしている間に、特定のパターンと日付に一致するファイルをどのように見つけることができますか?

Bourneシェルを使用しています。#!/bin/sh

特定のパターンに一致するファイルを探して、コマンドが実行されたときに各出力を新しいディレクトリにコピーするスクリプトを作成しています。

myscript.sh

#!/bin/sh

ssh user@hostname find /path/to/find/file* -mtime 10 | while read -r LINE
do
scp -r user@hostname:$LINE /path/to/destination/
done

以下は、同じファイル名パターンを持っていますが、そうでない他のファイルもあるファイルを見つけるための初期スクリプトです。だから私はgrepを使ってパイプを使って検索することにしましたが、それ以上読み取らず、ssh代わりに現在のディレクトリには明らかに存在しないファイルを見つけます。

例は次のとおりです。

ssh user@hostname find /path/to/find/* -mtime 10 | xargs zgrep -il 'pattern_to_find' | while read -r LINE
do
    scp -r user@hostname:$LINE /path/to/destination/
done

このコマンドを使用したかったのですが、find /path/to/find/* -mtime 10 | xargs zgrep -il 'pattern_to_find'しばらく一緒に使用すると|動作しなくなりました。

答え1

findパイプと一緒に使用しないでくださいxargs。これを行うには、ファイル名区切り文字で新しい行の代わりにnull文字を使用するには、withfind -print0とtoを使用します。xargs -0

からman find

-0を印刷してください。

Trueの場合、標準出力にファイル名全体を印刷し、その後にヌル文字(-printで使用される改行文字の代わりに)を印刷します。これにより、find 出力を処理するプログラムが改行またはその他の種類のスペースを含むファイル名を正しく解釈できます。このオプションは xargs の -0 オプションに対応します。

したがって、あなたのコマンドは次のようになります。

ssh user@hostname find /path/to/find/ -type f -mtime 10 -print0 | xargs -0 zgrep -il 'pattern_to_find'

しかし、-print0(私の記憶が正しいなら)POSIXではありません。したがって、方法は1つだけです。以下をお読みください。

または、パイプを使用せずにコマンドオプションを使用する最良の方法は次のとおりです-execfindxargs

ssh user@hostname find /path/to/find/ -type f -mtime 10 -exec grep -il 'set' {} + ;

バラよりすべてのファイルから文字列を再帰的に取得する方法は?

答え2

ssh -n user@hostname 'find /root/git/ -mtime 10 | while read -r LINE ; do echo $LINE; done'

-Nオプションは次のとおりですman ssh

-N/dev/nullから標準入力をリダイレクトします(実際には標準入力から読み取ることを防ぎます)。このオプションは、sshがバックグラウンドで実行されているときに使用する必要があります。 # ... # SSHプログラムはバックグラウンドに配置されます。 (sshでパスワードやパスフレーズが必要な場合、この方法は機能しません。-fオプションも参照してください。)

編集する

[OK]をクリックすると、findのファイル名がxargsに(文字列として)エコーされ、grep / zgrepに引数として渡される必要があります。以下を確認してください(-print0は必要ありません)。

ssh user@hostname find /path/to/find/* -mtime 10 | xargs echo | zgrep -i 'pattern_to_find' | while read -r LINE do scp -r user@hostname:$LINE /path/to/destination/ done

関連情報