3

を使用してダウンロードされたファイルのリストを取得することはできます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
4

3 に答える 3

2

生成される出力scpは、標準ストリーム (stdout または stderr) のいずれにも出力されないように見えるため、直接キャプチャするのは難しい場合があります。これを行う 1 つの方法はscp、(スイッチを使用して) 詳細情報を出力し、-vこの情報を取得して処理することです。2> 詳細情報は stderr に出力されるため、リダイレクト演算子を使用してキャプチャする必要があります。

たとえば、詳細出力をキャプチャするには、次のようにします。

scp -rv $USERNAME@HOSTNAME:~/backups/ . 2> scp.output

次に、この出力を次のようにフィルタリングできます。

awk '/Sending file/ {print $NF}' scp.output

このawkコマンドは、関連する行の最後の単語を単純に出力します。ファイル名にスペースが含まれている場合は、より堅牢なフィルターを考え出す必要があるかもしれません。

于 2012-12-06T11:30:29.917 に答える
1

について質問されたことは承知しておりますが、scpCopy files recursively from a server using ssh, and gets the file names that arecopy .

このscpソリューションには、少なくとも 1 つの問題があります。大量のファイルをコピーすると、各ファイルがトランザクションを生成するのに時間がかかります。の代わりにscp、 と を使用sshtarます。

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
于 2012-12-06T16:11:24.007 に答える
0
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」を使用してファイルリストを選択します

于 2013-10-16T03:23:40.423 に答える