web-dev-qa-db-ja.com

findの出力をscpの入力リストにパイプしたいのですが、どうすればよいですか?

私はLinuxの初心者ユーザーであり、あるコンピューターから別のコンピューターにファイルの長いリストを送信しようとしています。引数リストが長すぎるので、findを使用しています。しかし、式の設定に問題があります。誰か助けてもらえますか?

これが私が通常短い引数リストに入力するものです。

scp ./* phogan@computer/directory...

これはfindに変換されると思います。

scp find . -name "*" phogan@computer/directory...

多分私は配管を使うことができますか?どんな提案も役立ちます。前もって感謝します。

10
user13184
find . -name "*" -exec scp '{}' phogan@computer:/directory ';'

通常すべてのファイルを1つの巨大なblobにまとめて「tar」し、「scp」を1回だけ呼び出します。このようなもの:

tar czfv - file1 file2 dir1 dir2 | ssh phogan@computer/ tar xvzf - -C directory
  • Tarの--exclude =または--include =パラメータをいじることができます。
  • 別のオプションは、 rsync を使用することです。
16
akira

1つのコマンドscpでそれを行うことができます。

  • scpの新しいバージョンの場合:
scp `find <path> -name <expression>` user@Host:<path_where_to_copy>
  • 古いバージョンの場合:
scp --exec=`find <path> -name <expression>` user@Host:<path_where_to_copy>

findコマンドをbackticks`の間に必ずカプセル化し、一重引用符ではなく'

15
for f in `find . -name "*"`;do scp $f phogan@computer/directory;done
2
John T

私は提案します

find . -print0 | tar --null --files-from=/dev/stdin -cf - | ssh phogan@computer tar -xf - -C /directory

このソリューションでは、コマンドライン引数として解釈される可能性のあるファイル名がコマンドラインに表示されないようにすることに注意してください。

ファイル名にスペースが含まれている可能性があることにも注意してください。これは、bashのforループでファイル名のリストに問題が発生する可能性があることを意味します。

1
Erik Sjölund