シェルスクリプトでsftpを使用してリモートの場所にあるファイルの数を計算する

シェルスクリプトでsftpを使用してリモートの場所にあるファイルの数を計算する

リモートディレクトリで特定の種類のファイルを確認するために、次のコマンドを使用中にエラーが発生しました。要件は、特定のファイルの数を取得することです。

file_exists=$(sftp $FTP_UNAME@$FTP_HOST ls *$FILE_ID*.txt | wc -l)

これはよく書かないのですか?助けてください...

Below is the Usage Tip - 
usage: sftp [-1246aCfpqrv] [-B buffer_size] [-b batchfile] [-c cipher]
          [-D sftp_server_path] [-F ssh_config] [-i identity_file] [-l limit]
          [-o ssh_option] [-P port] [-R num_requests] [-S program]
          [-s subsystem | sftp_server] host
       sftp [user@]host[:file ...]
       sftp [user@]host[:dir[/]]
       sftp -b batchfile [user@]host

ベストアンサー1

sftpスクリプトで安定して使用することは困難です。代わりに、一部のプログラミング言語のSFTPモジュールを使用できます。 Perlを例に挙げましょうNet::SFTP::Foreign

perl -MNet::SFTP::Foreign -le '
  ($host, $dir, $id) = @ARGV;
  $s = Net::SFTP::Foreign->new($host, autodie => 1, fs_encoding => latin1);
  print scalar @{
    $s->ls($dir, names_only => 1, wanted => qr/\Q$id\E.*\.txt\z/s)
  }' -- "$FTP_UNAME@$FTP_HOST" . "$FILE_ID"

名前にログインディレクトリが含まれ、終了するファイルの数を報告します$FILE_ID。ファイルに含まれる内容(問題を引き起こす可能性のある空白など)とファイル名に含まれるすべての内容(問題になる可能性がある改行文字も含む)に関係なくです。.txt$FILE_ID;sftpwc -l

latin1エンコーディングはUTF-8デコードを試みず、ファイルパスでランダムなバイト値を使用します。)

シェル配列のファイルのリストを取得するには、次のようにしますzsh

files=( ${(0)"$(
  perl -MNet::SFTP::Foreign -l0 -e '
  ($host, $dir, $id) = @ARGV;
  $s = Net::SFTP::Foreign->new($host, autodie => 1, fs_encoding => latin1);
  print for @{
    $s->ls($dir, names_only => 1, wanted => qr/\Q$id\E.*\.txt\z/s)
  }' -- "$FTP_UNAME@$FTP_HOST" . "$FILE_ID")"}
)

バッシュ4.4+の場合:

readarray -td '' files < <(
  perl -MNet::SFTP::Foreign -l0 -e '
  ($host, $dir, $id) = @ARGV;
  $s = Net::SFTP::Foreign->new($host, autodie => 1, fs_encoding => latin1);
  print for @{
    $s->ls($dir, names_only => 1, wanted => qr/\Q$id\E.*\.txt\z/s)
  }' -- "$FTP_UNAME@$FTP_HOST" . "$FILE_ID")

終了状態は失われますがperl

おすすめ記事