BASH biri hariç tüm dosyaları kopyala


110

Default.png adlı dosya dışında bir dizindeki tüm dosyaları kopyalamak istiyorum. Görünüşe göre bunu yapmanın birkaç yolu var. Size en etkili olan nedir?


Kopyaladıktan sonra silmek yerine neden bu dosyayı atlamak için ihtiyacınız var? Hedef dizinde zaten var mı?
Lasse V. Karlsen

1
Evet, aynı ada sahip bir dosya zaten hedef dizinde yaşıyor.
Joe Cannatti

@ LasseV.Karlsen: Veya büyük bir dosyaysa, kopyalama zamanından tasarruf etmek isteyebilirsiniz. Bununla ilgileniyorum ama bir dosya yerine bir dizini hariç tutuyorum.
Nikana Reklawyks

Yanıtlar:


54

Basit, src/yalnızca dosya içeriyorsa:

find src/ ! -name Default.png -exec cp -t dest/ {} +

Eğer src/alt dizinleri, bu atlar onları vardır, ancak bunların iç kopya dosyaları yapar:

find src/ -type f ! -name Default.png -exec cp -t dest/ {} +

Eğer src/alt dizinleri vardır, bu onların içine recurse değildir:

find src/ -type f -maxdepth 1 ! -name Default.png -exec cp -t dest/ {} +

5
Bu benim için en iyisi gibi görünüyor çünkü OS X glob etkinleştirilmeden gönderiliyor gibi görünüyor.
Joe Cannatti

6
@Max \;komutu dosya başına bir kez yürütür. +komutu bir kez çalıştırır ve tüm dosya adlarını bir kerede ona iletir (komut satırı uzunluk sınırına tabidir). +genel olarak biraz daha etkilidir.
John Kugelman

149

Aşağıdaki gibi olmalıdır:

cp -r !(Default.png) /dest

Mevcut klasörde iç içe geçmiş bir klasöre kopyalıyorsanız (aşağıdaki durumda örnek olarak adlandırılır), o dizini de atlamanız gerekir:

cp -r !(Default.png|example) /example

17
Bu -bash:! Üretir: olay bulunamadı
Joe

Dosyaları kopyaladığınız klasörün içindeki bir klasöre mi kopyalıyorsunuz?
Jon

47
shopt -s extglobDevre dışı bırakılmışsa, bunun çalışması gerekir .
Barry Kelly

5
OS X'in shopt -s extglob@BarryKelly tarafından açıklandığı gibi kullanılması gerektiği anlaşılıyor. Bununla mükemmel çalışıyor.
Kat

Yıllar on Bash ve bilmediğim !()... Güzel! --Like hissetmek bana-- edenlerin özellikle çalışma / inceleme zamanı bash , burada bu soru / cevap ile ilgili alakalı bağlantılar vardır: shopt / extglob ve desen .
Brandt

73

rsync, uzun süredir benim cp / scp değişimim oldu:

rsync -av from/ to/ --exclude=Default.png

-a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
-v, --verbose               increase verbosity

İki farklı dosyayı tarama dışında bırakmak istersem, bunu nasıl kullanırım?
Pulkit Bansal

multiple --exclude = argümanlar desteklenir. -rDizinleri senkronize ediyorsanız argümanı da unutmayın
Rian Sanderson

5

Sadece yapardım:

cp srcdir/* destdir/ ; rm destdir/Default.png

dosyalar büyük değilse. Aksi takdirde örneğin kullanın

find srcdir -type f/ |grep -v Default.png$ |xargs -ILIST cp LIST destdir/

1
İlk komut, OP'nin istediği şey değil. Eğer Default.pngiki dizin var, bu bir tane yerini alacak destdirbirer srcdir, sonra kopyalanan silin Default.png. Bunun yerine, OP Default.pngzaten var olanı korumak istiyor destdir.
SnowFrog

2
default.png, destdir'de zaten var mı? Çözümünüz işe yaramayacak.
Iman Muhammed Muhammed

2

Bu, düğüm modülleri hariç her şeyi kopyalamak için harika çalışıyor :) keyfini çıkarın ve yukarıdaki cevaplar sayesinde ona biraz önce ekledim. Bence Rsync, istemeden ilerleme çubuğunu görebileceğiniz için CP'den daha iyidir.

   rsync -av fromDirectory/ ToDirectory/ --exclude=node_modules


-1
# chattr +i /files_to_exclude
# cp source destination
# chattr -i /files_to_exclude

-2

kabuğun genişletme parametresini regex ile kullanın

cp /<path>/[^not_to_copy_file]* .

Not_to_copy_file dışında her şey kopyalanacak

- bunda bir sorun varsa. lütfen belirtiniz !


1
SO'ya hoş geldiniz. Maalesef cevabınız doğru değil. Parantez ifadesi ( [...]) eşleşecek bir dizi karakter içerirken, bir satır aralığı ^listelenen karakterlerin tamamlayıcısı ile eşleşmeye neden olur. Aşağıdaki örnekte, ne dosya listelenir: touch not_to_copy_file to_copy_file ; ls [^not_to_copy_file]*Aşağıdaki karakterlerden herhangi başlayarak tüm dosya adları dışlanır çünkü: _cefilnopty.
rtx13
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.