Saya ingin menyalurkan output find ke daftar input scp, bagaimana?

10

Saya pengguna linux pemula dan saya mencoba mengirim daftar panjang file dari satu komputer ke komputer lain. Daftar argumen terlalu panjang, jadi saya menggunakan find. Tapi saya kesulitan mengatur ekspresi. Adakah yang bisa membantu?

Inilah yang biasanya saya ketik untuk daftar argumen pendek.

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

Inilah saya pikir ini mungkin diterjemahkan dengan find.

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

Mungkin saya bisa menggunakan pipa? Setiap saran akan membantu. Terima kasih sebelumnya.

pengguna13184
sumber

Jawaban:

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

Biasanya saya akan 'tar' semua file menjadi satu gumpalan besar dan memanggil 'scp' sekali saja. Sesuatu seperti ini:

tar czfv - file1 file2 dir1 dir2 | ssh phogan@computer/ tar xvzf - -C directory
  • Seseorang dapat bermain-main dengan parameter --exclude = atau --include = tar.
  • Pilihan lain adalah menggunakan rsync .
akira
sumber
jika menggunakan kata sandi dengan ssh / scp, bukankah solusi dengan find akan meminta kata sandi pada setiap file?
Quack quixote
memungkinkan hanya berasumsi dia tahu bagaimana menggunakan ssh-tombol :) masalah dengan 1000 pertanyaan sandi juga alasan untuk tar-pendekatan
akira
15

Anda dapat melakukannya hanya dengan satu perintah scp.

  • untuk versi yang lebih baru scp:
scp `find <path> -name <expression>` user@host:<path_where_to_copy>
  • untuk versi yang lebih lama:
scp --exec=`find <path> -name <expression>` user@host:<path_where_to_copy>

Pastikan untuk merangkum findperintah di antara backticks ` dan bukan tanda kutip tunggal ' .

Carlos Rodrigues
sumber
Versi scp yang mana, distribusi linux yang mana itu? Misalnya scp di Ubuntu 14.04 tidak memiliki opsi ini.
geekQ
2
Hai, versi lama mendukungnya, versi baru mendukung perintah yang lebih sederhana:scp `find <path> -name <expression>` user@host:<path_where_to_copy>
Carlos Rodrigues
1
Tidak berfungsi pada banyak file
Amruta
@Amruta use-r
slybloty
@slybloty scp -radalah untuk rekursi pada satu entri (direktori), bukan untuk banyak entri (banyak file).
AndrewF
2
for f in `find . -name "*"`;do scp $f phogan@computer/directory;done
John T
sumber
ya dia ingin satu perintah saja
John T
berguna, menggunakannya dengangrep -l pattern *
Tanj
Tampaknya tidak berfungsi pada file dengan spasi di dalamnya.
Christophe De Troyer
1

saya akan menyarankan

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

Perhatikan, bahwa solusi ini menghindari memiliki nama file pada baris perintah di mana mereka dapat ditafsirkan sebagai argumen baris perintah.

Hal lain yang harus diperhatikan adalah nama file mungkin berisi spasi. Ini berarti bahwa for for in bash mungkin mengalami kesulitan dengan daftar nama file.

Erik Sjölund
sumber