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