Dosyaları Linux'ta kopyalayın, hedefte dosyalar varsa kopyadan kaçının


32

Bir / home / user klasörünü bir sabit diskten diğerine kopyalamam gerekiyor. 100.000 dosya ve yaklaşık 10G boyutunda.

kullanırım

cp -r /origin /destination

bazen kopuk bağlantılar, izinler vb. nedeniyle bazı hatalar alıyorum. Bu yüzden hatayı düzeltirim ve kopyayı tekrar başlatmam gerekiyor.

"Cp" komutunu nasıl söyleyebileceğimi merak ediyorum, bir kez daha kopyalamaya çalışır, hedef klasörde varsa dosyaları tekrar kopyalamamaya çalışır.


2
Bize cp yok. Bunun yerine rsync kullanın.
William Pursell

Yanıtlar:


22

cp -R -u -p /source /destination

-u( Veya--update ) bayrağı sadece bu yapar:

Cp'nin man sayfasından:

-u, --update

yalnızca SOURCE dosyası hedef dosyadan daha yeni olduğunda veya hedef dosya eksik olduğunda kopyala


6
Anlamıyla sadece, mevcut olanları güncellemek mevcut değil olmayan dosyaları kopyalamak için yes n | cp -i /source/* /destination 2>/dev/null
sventechie

4
-u, --update kopyası yalnızca SOURCE dosyası hedef dosyadan daha yeni olduğunda veya hedef dosya eksik olduğunda -u, --update kopyası yalnızca SOURCE dosyası hedef dosyadan daha yeni olduğunda veya hedef dosya eksik olduğunda -p ile aynı --preserve = mod, sahiplik, zaman damgaları --preserve [= ATTR_LIST] belirtilen özellikleri korur (varsayılan: mod, sahiplik, zaman damgası), eğer mümkünse ek özellikler: bağlam, bağlantılar, xattr, tümü
Covich

51

Sadece kullan cp -n <source> <dest>.

Gönderen adam sayfası :

-n, --no-clobber

varolan bir dosyanın üzerine yazmaz (önceki -i seçeneğini geçersiz kılar)


7
Bu sorunun tek doğru cevabı.
sebix

20

rsync -aq /src /dest

Yalnızca daha yeni dosyaları kopyalamanın yanı sıra, dosya değiştiyse yalnızca daha yeni dosyaların parçalarını da kopyalar. Veri miktarını en aza indirmek istediğiniz ağ bağlantılarını kopyalamak için tasarlanmıştır, ancak yerel olarak da mükemmel çalışır.


Gönderinize biçimlendirme ekleyemiyorum çünkü yalnızca iki karakter. Bunu düzenleme ve emrinize `` karakterleri ekleme hakkında ne düşünüyorsunuz?
culix

4

cpKomut için "-u" seçeneğine bakın .


2
-U kullanmanın iyi bir fikir olduğunu kabul etmiyorum. -u yalnızca kaynak yeni olduğunda veya hedef eksik olduğunda kopyalar. Orijinal posterin konusu, her ne sebeple olursa olsun dosya koparma nedeniyle oldu. Bu nedenle OP, kopyayı yeniden çalıştırırken güncellenmeyen yarı yazılı bir dosyaya sahip olacaktır. Bu dosya birisi için önemli olabilir! rsync bu sorunu çözdü.
hazymat

2

Yukarıdaki tüm cevaplar doğrudur, ancak bunu tekrarlı bir şekilde yapıyorsanız, o zaman

yapmalısın:

 cp -rn SOURCE_PATH DESTINATION_PATH

1

İzinleri / mülkiyeti korumak için kök olarak kopyalamanız gerekir

# cp -au

Ayrıca rsync'e bakın


1

POSIX çözümü

Diğer cevapların kullanımı -u veya -nseçenekleri cp. Bunların hiçbiri POSIX tarafından gerekli değildir ; ne de rsyncbaşka bir cevaptan değil; ne de yesyorumlardan birinde kullanılmaz.

Yine de yes nbir whiledöngü ile çoğalabiliriz . Bu, aşağıdaki POSIX çözümüne yol açar:

while true; do echo n; done | cp -Ri /origin /destination 2>/dev/null

0

kullanım cp -rn <sourcedirname>/. <destdirname>

R anahtarı, kopyayı dizinler üzerinde özyinelemeli yapar.

N anahtarı (uzun versiyon no-Clobber) mevcut dosyaların asla üzerine yazılmamasını sağlar.

/.Sourcedirname'den sonra gelen ' ', ikincisine kopyalanan tüm içeriğin yerine destdirname altında bir alt dizin haline gelmemesini sağlar.

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.