を使用してダウンロードされたファイルのリストを取得することはできますscp -r
か?
例:
$ scp -r $USERNAME@HOSTNAME:~/backups/ .
3.tar 100% 5 0.0KB/s 00:00
2.tar 100% 5 0.0KB/s 00:00
1.tar 100% 4 0.0KB/s 00:00
期待される結果:
3.tar
2.tar
1.tar
生成される出力scp
は、標準ストリーム (stdout または stderr) のいずれにも出力されないように見えるため、直接キャプチャするのは難しい場合があります。これを行う 1 つの方法はscp
、(スイッチを使用して) 詳細情報を出力し、-v
この情報を取得して処理することです。2>
詳細情報は stderr に出力されるため、リダイレクト演算子を使用してキャプチャする必要があります。
たとえば、詳細出力をキャプチャするには、次のようにします。
scp -rv $USERNAME@HOSTNAME:~/backups/ . 2> scp.output
次に、この出力を次のようにフィルタリングできます。
awk '/Sending file/ {print $NF}' scp.output
このawk
コマンドは、関連する行の最後の単語を単純に出力します。ファイル名にスペースが含まれている場合は、より堅牢なフィルターを考え出す必要があるかもしれません。
について質問されたことは承知しておりますが、scp
「Copy files recursively from a server using ssh, and gets the file names that arecopy .
このscp
ソリューションには、少なくとも 1 つの問題があります。大量のファイルをコピーすると、各ファイルがトランザクションを生成するのに時間がかかります。の代わりにscp
、 と を使用ssh
しtar
ます。
ssh $USERNAME@HOSTNAME:~/backups/ "cd ~/backups/ && tar -cf - ." | tar -xf -
それで、 atee
と aを追加すると、tar -t
必要なものが得られます。
ssh $USERNAME@HOSTNAME:~/backups/ "cd ~/backups/ && tar -cf - ." | tee >(tar -xf -) | tar -tf - > file_list
>(...)
コンストラクト (プロセス置換) は一般的なオプションではないため、すべてのシェル (bash は問題ありません) では機能しない可能性があることに注意してください。シェルにそれがない場合は、fifo を使用できます (基本的に、プロセスの置換で許可されるものは短くなります)。
mkfifo tmp4tar
(tar -xf tmp4tar ; rm tmp4tar;) &
ssh $USERNAME@HOSTNAME:~/backups/ "cd ~/backups/ && tar -cf - ." | tee -a tmp4tar | tar -tf - > file_list
scp -v -r yourdir orczhou@targethost:/home/orczhou/ \
2> >(awk '{if($0 ~ "Sending file modes:")print $6}')
-v "Sending file modes: C0644 7864 a.sql" を stderr に出力する必要があります
「awk」を使用してファイルリストを選択します