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' {} + ;