SFTPサーバーがあります([Eメール保護])。それに接続して、以下を含むファイルを検索しようとしています。。 txtパス(/files/base/incomming)から(.txt)を含む各ファイルの行数を取得します。次のコマンドを使用してこれを達成しようとしましたが、無効なコマンドで発生しました。
echo "wc -l *.txt*"|sftp -q [email protected]:/files/base/incomming
o/p
sftp>
invalid command
この問題を解決する方法はありますか?
答え1
sftp
シェルはフォークされないため、一般的なコマンドは使用できません。合格できると仮定すると、ssh
次のものを使用できます。
ssh [email protected] 'ls /files/base/incomming/*.txt' | wc -l
または
ssh [email protected] 'ls /files/base/incomming/*.txt | wc -l'
質問に記載されている作業を完了してください。
(何らかの理由で)使用するには、いずれかのコマンドをsftp
使用する必要があります(相手がワイルドカードを処理する方法を知っていることを願っていますftp
)。ftpd
echo 'ls -l /files/base/incomming/*.txt' | sftp [email protected] | wc -l
答え2
ファイル数が多すぎない場合は、globbingを使用して一致する各ファイル名に位置引数を設定してから、数をエコーできます。
count=$(ssh [email protected]
'set -- /files/base/incomming/*.txt; echo "$#"')
またはファイル数はい大きい(だが次より小さい。uintmax_t
)、GNU find(拡張用)がある場合は、-printf
次のものを使用できます。スティーブンから見たトリック:
count=$(ssh [email protected]
'find /files/base/incomming -maxdepth 1 -type f -name '*.txt' -printf . | wc -c')
上記のfind
コマンドは、指定されたディレクトリに対してコマンドを実行し、深さをそのディレクトリに制限し、名前が;で-type f
終わる.txt
通常のファイル()に一致を制限します。各一致に対してピリオドが印刷され、合計はコマンドが置き換えwc -c
られ、返された割り当てから計算されますcount
。