Bashを使用して、一部のリモートフォルダにファイルがあることを確認します。

Bashを使用して、一部のリモートフォルダにファイルがあることを確認します。

特定のフォルダを調べて、そのフォルダにファイルがあるときに電子メールを送信するスクリプトを作成する必要があります。
同様の操作を試しましたが、コマンド変数とフォルダの印刷にエラーが発生しました。

for folder in "FOLDER1" "FOLDER2";  do
  command=`ssh -q user@host "ls /usr/local/username/`{print $folder}` | wc -l"`
  #echo $command

  if [ $command -ne '0' ]
  then
    #send error email 
  fi
done

答え1

以下を試してください。

command=$(ssh -q user@host 'ls "/usr/local/username/'$folder'" | wc -l')

実際、逆引用符を入れ子にすることはできません(そしてなぜそうするのかわかりません)。

答え2

これははるかに簡単かもしれません。何をしたいのかわかりません{print $folder}。ここで中括弧は意味がありません。$folder文字列に含めたい場合$folder出力を解析しないでください。ls、ほとんど動作しませんし、しばしば失敗します。

if ! ssh user@host "test -e '/usr/local/username/$folder'"; then
  # the file doesn't exist

リモートシェルでは、ファイル名を引用符で囲む必要があります。私は上記のコマンドでリモートコマンドのファイル名を一重引用符で囲んでこの問題をほとんど解決しましたが、これは$folder一重引用符自体が含まれていない場合にのみ機能します。ローカルシェルがbash、ksh93、またはzshの場合は、代わりに一重引用符を使用してください。

q=\'\\\'\'
if ! ssh user@host "[ -d '/usr/local/username/${folder//\'/$q}' ]"; then

より便利な別の方法は、以下を使用してリモートファイルシステムをマウントすることです。sshfs通常のファイルシステムインタフェースを介して処理します。同時に多くのリモートサーバーを使用しない限り、この方法をお勧めします。

mkdir /path/to/mount/point
sshfs user@host /path/to/mount/point
if ! [ -d "/usr/local/username/$folder" ]; then

関連情報