Bazı dosyalar nasıl kopyalanır?


54

Böylece, bir dizinin içeriğini *kullanırken tüm dosyalar için joker karakter olarak kullanabilirsiniz cp. Dosya dışındaki tüm dosyaları kopyalamanın bir yolu var mı x?

Yanıtlar:


42

İçinde bashkullanabilirsiniz extglob:

 $ shopt -s extglob  # to enable extglob
 $ cp !(b*) new_dir/

nerede !(b*)tüm dışlamak b*dosyaları.

Daha sonra devre dışı bırakabilirsiniz extglobile

 $ shopt -u extglob

Tcsh kabuğuna eşdeğer bir şey olup olmadığını biliyor musun?
Levon,

Maalesef yapmam. Görünüşe göre findtek yol tcsh:find . -maxdepth 1 ! -name "exclude*" -exec cp -t destination {} \+
rush

50

Rsync bunu çok iyi idare ediyor.

Örnek hepsini kopyala: rsync -aP /folder1/* /folder/2

Hariç tutulan tüm örnek kopya: rsync -aP --exclude=x /folder1/* /folder2/

-aPanahtar:

a: Benzer cp -a, özyinelemeli vb. P: İlerlemeyi gösterir, rsync'in güzel bir özelliği.


5
Ve bu cevabı , ortak rsync hariç tutma listelerine kısa bir rehber için bakın.
Gilles 'SO- kötülük olmayı bırak'

1
Darwin / MacOS'ta, tekrar etmek istiyorsanız -rPyerine kullanın -aP. -aarşivleme içindir. Bunun değişip değişmediğinden veya MacOS'ta farklı olup olmadığından emin değilsiniz.
jpoveda

rsyncözyinelemeli yapmak için seçeneğiniz var. Örnek: rsync --recursive -P --exclude=x /folder1/* /folder2/. (Sadece Ubuntu'da test edilmiştir)
n1k31t4

12

Bu bir özellik değil cp, kabuğunuzun bir özelliğidir ( *nokta olmayan tüm dosyaları ifade edecek şekilde genişler ), bu nedenle cevap kullandığınız kabuğa göre değişir. Örneğin, zshbu sözdizimini destekler:

$ cp ^x /path/to/destination

Nerede ^x"dışındaki tüm dosyalar anlamına x"

Ayrıca, seçim ve seçim kalıplarını da kaldırabilirsiniz, örneğin xyz içerenler dışındaki tüm wav dosyalarını kopyalamak için, şunları kullanabilirsiniz:

cp *.wav~*xyz*

Herhangi bir yorumunuz var bashmı?
Chad Harrison

@hydroparadise Ben bash hakkında pek bir şey bilmiyorum, ama bu cevap onu örtüyor gibi görünüyor
Michael Mrozek

Ya tcsh? Bilen var mı?
Levon,

4

Ayrıca düz eski (portatif / uyumlu) bourne kabuğunda, standart aletlerle, gelişmiş kabuk kürecilik veya yerleşik dışlama seçeneklerine sahip komutlar kullanmaktan çok daha az zarif bir şekilde çeşitli şekillerde yapılabilir.

Çok fazla dosya yoksa (ve boşluklar ve / veya satır çizgiler dahil isimlerle), bu bir yol olabilir:

cp `ls | egrep -v '^excludename$'` destdir/.

Elbette bashve GNU araçları harika ve güçlü, ancak yine de her zaman kullanılamıyorlar. Taşınabilir bir betiğe koymayı düşünüyorsanız, findRush'ın yorumundaki gibi öneririm .


2
Cevabınızın son kısmının sadece konuyla ilgili dikkatini dağıtdığını buluyorum. Ayrıca, "Unix" artık altın standart değil (eğer öyleyse). Bu, "Unix ve Linux" olmasına rağmen, bir şeyin "Unix" olup olmaması ile ilgili değildir.
Alexander

2
TAMAM. Yorumu buraya buraya taşıdım: Unix GNU değil. Bazı şeylerin “eşlik etmemesinin” çok ilginç olmadığı konusunda hemfikirim, ancak yine de taşınabilirliğine ve tarihiniz hakkında biraz bilgi sahibi olmaya hala inanıyorum.
MattBianco

Orada seninle tamamen aynı fikirdeyim.
Alexander

2

Bir klasördeki her şeyi (alt klasörler dahil) belirli bir alt dizine kopyalamak istiyorsanız:

cp -R $(ls | grep -v '^subdir$') subdir/

Sh, bash, zsh (en azından) ile çalışır.


1
Beni bunun aynı niyet olmadığına ikna etcp -R * subdir/
roaima 28:15

1
Bu komutu "cp -R * subdir /" kullanırsanız, bash / zsh 'subdir' komutunu yinelemeli olarak kopyalamaya çalıştı. Bir hata ile bitiyorsun: "isim çok uzun (kopyalanmadı)".
user2707671

İyi bir nokta. Öneriniz , " / cpdan bash/ değil sh" uyarısından kaçınmaya çalışır cp: cannot copy a directory, ‘subdir’, into itself, ‘subdir/subdir’. Kopyalama yine de doğru bir şekilde tamamlandı. Maalesef varyantınız, boşluk veya kabuğa duyarlı noktalama işareti içeren herhangi bir dosya adını kırar. Bkz. Unix.stackexchange.com/q/128985/135943
roaima

-1

extglob Sanırım şu ana kadarki en iyi yol.

Başka bir yol kullanıyor cp $(ls --ignore=x) subdir/


Bu, dosya adlarında herhangi bir özel karakter verilen herhangi bir veriyi kesecektir. (Boşluklar, yeni satırlar $vb.) Çıktısını asla ayrıştırmaz ls. unix.stackexchange.com/q/128985/135943
Joker
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.