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つだけです。以下をお読みください。
または、パイプを使用せずにコマンドオプションを使用する最良の方法は次のとおりです-exec
。find
xargs
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