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


10

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

これは、短い引数リストに対して通常入力するものです。

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

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

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

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

回答:


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

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

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

ssh / scpでパスワードを使用する場合、findを使用したソリューションはすべてのファイルでパスワードを要求しませんか?
Quack quixote、2009年

彼がssh-keysの使い方を知っていると仮定しましょう:) 1000個のパスワードの質問の問題もtarアプローチの理由です
akira

15

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間でコマンドをバッククォート `ではなく単一引用符"


どのscpバージョン、どのLinuxディストリビューションですか?たとえば、Ubuntu 14.04のscpにはこのオプションはありません。
geekQ 2015

2
こんにちは、古いバージョンはそれをサポートし、新しいバージョンはより簡単なコマンドをサポートします:scp `find <path> -name <expression>` user@host:<path_where_to_copy>
Carlos Rodrigues

1
複数のファイルでは機能しません
Amruta

@Amrutaの使用-r
slybloty 2018

@slybloty scp -rは、複数のエントリ(複数のファイル)ではなく、単一(ディレクトリ)エントリの再帰用です。
AndrewF

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

そう、彼はとにかく単一のコマンドを望んでいる
ジョンT

便利です。一緒に使用grep -l pattern *
Tanj

スペースが含まれているファイルでは機能しないようです。
Christophe De Troyer 2017

1

私は提案します

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

このソリューションでは、コマンドライン引数として解釈される可能性のあるコマンドラインにファイル名を含めることを避けていることに注意してください。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.