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.

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 .

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 ' .


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

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.