Ben scp giriş listesine find çıkış boru istiyorum, nasıl?


10

Ben acemi bir linux kullanıcısıyım ve bir bilgisayardan diğerine uzun bir dosya listesi göndermeye çalışıyorum. Argüman listesi çok uzun, bu yüzden find kullanıyorum. Yine de ifadeyi ayarlamakta sorun yaşıyorum. Birisi yardımcı olabilir mi?

İşte normalde kısa bir argüman listesi için yazacağım.

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

İşte bunun bulmayla çevrilebileceğini düşünüyorum.

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

Belki boruları kullanabilirim? Herhangi bir öneri yardımcı olacaktır. Şimdiden teşekkürler.

Yanıtlar:


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

Normalde tüm dosyaları tek bir dev bloba 'tar' ve sadece bir kez 'scp' çağırır. Bunun gibi bir şey:

tar czfv - file1 file2 dir1 dir2 | ssh phogan@computer/ tar xvzf - -C directory
  • Biri tar --exclude = veya --include = parametreleriyle oynayabilir.
  • Başka bir seçenek rsync kullanmak olacaktır .

ssh / scp ile parolalar kullanılıyorsa, find ile çözüm her dosyada parola istemez mi?
quack quixote

sadece ssh tuşlarını kullanmayı bildiğini varsayalım :) 1000 şifre sorusu ile ilgili sorun da tar-yaklaşımının sebebidir
akira

15

Bunu tek bir komutla yapabilirsiniz scp.

  • daha yeni sürümleri için scp:
scp `find <path> -name <expression>` user@host:<path_where_to_copy>
  • eski sürümler için:
scp --exec=`find <path> -name <expression>` user@host:<path_where_to_copy>

Enkapsüle etmek emin olun findaradaki komutu ters tırnakların ` ve tek değil tırnak ' .


Hangi scp sürümü, hangi linux dağıtımı? Örneğin Ubuntu 14.04'teki scp'de bu seçenek yoktur.
geekQ

2
Merhaba, eski sürümler destekliyor, yeni sürümler daha basit bir komutu destekliyor:scp `find <path> -name <expression>` user@host:<path_where_to_copy>
Carlos Rodrigues

1
Birden fazla dosyada çalışmıyor
Amruta

@Amruta use-r
slybloty

@slybloty scp -r, tek bir (dizin) girişte özyineleme içindir , birden çok giriş (birden çok dosya) için değildir.
AndrewF

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

evet yine de tek bir komut istiyor
John T

yararlı, ile kullanılırgrep -l pattern *
Tanj

İçinde boşluk olan dosyalar üzerinde çalışmıyor gibi görünüyor.
Christophe De Troyer

1

öneririm

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

Bu çözümün, komut satırında dosya adlarının komut satırı bağımsız değişkenleri olarak yorumlanabileceğini unutmayın.

Dikkat edilmesi gereken başka bir şey de dosya adlarının boşluk içerebileceğidir. Bu, bash içindeki bir for döngüsünün bir dosya adları listesiyle ilgili zorluklar yaşayabileceği anlamına gelir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.