実際にはファイル名を一覧表示できますが、そこでも望ましくない内容がたくさん出てきます。
> echo "ls *.txt" | sftp user@host:/dir
Connected to 1.1.1.1.
Changing to: /dir
sftp> ls *.txt
1.txt
2.txt
3.txt
ファイルのみをリストし、ファイルのみをリストする証明された信頼できる方法はありますか?可能であればhead
同様のフィルタを使用しないでください。
答え1
オプションを使用してはいと-q
言うsftp
キューueet、したがって、興味のないほとんどの出力を抑制します。
echo "ls *.txt" | sftp -q [email protected]:/path
たとえば、エコーしているインタラクティブプロンプト行は引き続き表示されますが、次を使用してその行sftp> ls *.txt
をフィルタリングできますgrep -v
。
echo "ls *.txt" | sftp -q [email protected]:/path | grep -v '^sftp>'
最善の方法は、バッチファイルを使用してパイピングするのではなく、-b
パラメータsftp
と一緒に渡すことです。echo
もし本物あなたがしたいことはリストssh
ファイルを使用するよりも実際に優れている可能性がありますsftp
(最終的にはいこれSエクールFエリーティー移動する 血プログラム):
ssh [email protected] ls -1 /path
答え2
リモートディレクトリツリーをマウントするSSHFS。 SSHFSは、SFTPプロトコルを使用してリモートファイルにアクセスするリモートファイルシステムです。サーバーがSFTPアクセスを許可している場合は、SSHFSを使用できます(サーバーの観点からも同様です)。クライアント側で使用するには承認が必要です。ヒューズ、これはほとんどの最新のユニークの場合です。
ファイルシステムがマウントされると、ファイルが実際にリモートであるかどうかに関係なく、すべての一般的なコマンドを使用できます。
mkdir host-dir
sshfs user@host:/dir host-dir
echo host-dir/*.txt
…
fusermount -u host-dir
答え3
sftp -q user@host:/dir <<<"ls *.txt" | grep -v '^sftp>`
ただし、これはsftpがパスワードを要求しない場合にのみ機能します。 grep -v は sftp のパスワード要求に影響を与えるからです。
しかし、tailを使用すると、多くの場合非常に簡単になると思います。
sftp -q user@host:/dir <<<"ls *.txt" | tail -n+2
答え4
ディレクトリにファイルのみがあるとします。ただし、サブディレクトリがある場合、そのディレクトリもエクスポートリストに含まれます。したがって、何らかの方法でサブディレクトリもフィルタリングする必要があります。 ls -lを使用してdで始まる行をフィルタリングできます。
sftp -q user@host:/dir <<<"ls -l *.txt" | grep -v -E "^sftp|^d"
しかし、これはまだシンボリックリンクを残すでしょう。したがって、おそらく:
sftp -q user@host:/dir <<<"ls -l *.txt" | grep -v "^sftp"| grep -- ^-
どこ
grep -v -E "^sftp|^d"
フィルタsftp cmdまたは^d - ディレクトリの印刷、^ lシンボリックリンク..また何がありますか?grep -- ^-
ファイルのみが表示されます。
ただし、ls -l..には重複した情報があるため、これも切り捨てる必要があります。直接方法でcutまたはawkを使用してください。
sftp -q user@host:/dir <<<"ls -l *.txt" | grep -v "^sftp"| grep -- ^- | tr -s ' '|cut -d' ' -f9
sftp -q user@host:/dir <<<"ls -l *.txt" | grep -v "^sftp"| grep -- ^- | awk -F' ' '{print $9}'
sftp -q user@host:/dir <<<"ls -l *.txt" | grep -v "^sftp"| grep -- ^- | cut -c57-
tr -s ' '
繰り返される空白を圧縮します。 Turther フィールドのソートに使用されます。cut -d' ' -f9
フィールド#9だけを保持します(通常はファイル名ですが、システムを確認してください)。awk -F' ' '{print $9}'
9番目のフィールドのみが出力されます。cut -c57-
文字1-56を削除し、私のシステムにファイル名を保持します。この脆弱性は、ファイル名にスペースが含まれているときに私が見つけた唯一のオプションです。
だから簡単なリストを得ることは本当に奇妙です。sftpファイルのみ追加処理に使用できます。
更新:ファイル名にスペースが含まれている場合、cut -c57-
ls -lからファイル名を抽出するよりも良い方法が見つかりません。ただし、システムごとにls出力の名前フィールドの場所が異なる可能性があり、ファイル所有者名が長い場合、同じシステムでもデータを移動できるため、信頼できません。ls -n
名前を数値IDに変更することでこの問題を回避できますが、このアプローチはまだ「良い」ではありません。
awkを使用して$ 0の最初の場所である$ 9から始め、$ 0行の終わりまでファイル名を抽出しようとしています。 awkで$ 0行の$ 9フィールドの位置を取得する方法を知っている人はいますか?
私はこれを行うための確実な方法が見つかりませんでした。index($0,$9)
ファイル名が最初の列のユーザー名または数字と一致すると、誤った結果が生成されます。 $ 1 length
、$ 2.
ls -n *
また、使用するとディレクトリ名の後に印刷され、/
フィルタリングが簡単になることがわかりました。ただし、glob マスクを使用すると、ls
何も見つからない場合は、メッセージ(Can't ls: "/curdir / *" notfound)がstderrに報告されます。これは迷惑です。
それでは、sftpでスペースやその他の特殊文字を含むファイル名を処理できる一般的なファイルのリストを取得する方法を知っている人はいますか?