Bir dizinden diğerine yalnızca normal dosyaları kopyala


12

Bir dizin 1 içeriğini dizin 2'ye kopyalamak istiyorum. Ancak, dizin 1'den yalnızca dosyaları (dizinleri değil) kopyalamak istiyorum. Bunu nasıl yapabilirim?

cp dir1/* dir2/*

o zaman hala dizin sorunu var.

Ayrıca, tüm dosyalarımın herhangi bir uzantısı yok . hile yapmayacak


1
Uzantıların onunla ne ilgisi olduğunu bilmiyorum.
ctrl-alt-delor

1
cp dir1/* dir2veyacp -t dir2 dir1/*
ctrl-alt-delor

@richard DOS dünyasından, dizinler için uzantı kullanmama konusunda oldukça yaygın bir alışkanlık var, bu da bir dereceye kadar hayatta kalıyor, bazı insanların bir nokta varsa, bir dizin olmadığını ve bunun tersi olduğunu varsaymasına neden oluyor.
Gilles 'SO- kötü olmayı bırak'

Tamam ama yine de uygun değil.
ctrl-alt-delor

Yanıtlar:


18
cp dir1/* dir2

cpaçıkça belirtilmedikçe dizinleri kopyalamaz ( --recursiveörneğin, bkz. man cp).

Not 1: cp büyük olasılıkla sıfır olmayan bir durumla çıkar, ancak dosyalar yine de kopyalanmış olacaktır. Çıkış kodları dayalı komutlar zincirleme kurarken bu sorunu olabilir: &&, ||, if cp -r dir1/* dir2; then ..., vb (sayesinde contrebis için bu konuda kendi yorumunu )

Not 2 : cpson parametrenin tek bir dosya adı veya dizin olmasını bekler. *Hedef dizinin adından sonra gerçekten joker karakter olmamalıdır . dir2\*kabuk gibi genişleyecektir dir1\*. Beklenmedik şeyler olacak :

  • Eğer dir2boş ve kabuk ve ayarlarına bağlı olarak geçerli:
    • en iyi senaryo olan bir hata mesajı alabilirsiniz.
    • dir2/*kelimenin tam anlamıyla alınacak (adında bir dosya / dizin aranacak *) *.
    • dir2/*sadece komuttan tamamen çıkarılır ve ayrılır cp dir1/*. Genişlemesine bağlı olarak, dir1/*verileri bile yok edebilir:
      • dir1/*Yalnızca bir dosya veya diziyle eşleşirse , hata alırsınız cp.
      • dir1/*Tam olarak iki dosyayla eşleşirse , diğerinin üzerine yazılacaktır ( Kötü ).
      • Birden dir/*fazla dosyayla eşleşiyorsa ve son eşleşme bir ise, bir hata mesajı alırsınız.
      • Öğesinin son eşleşmesi dir/*bir dizinse, diğer tüm eşleşmeler dizine taşınır.
  • dir2Boş değilse , tekrar bağlıdır:
    • Öğesinin son eşleşmesi dir2/*bir dizinse dir1/*ve diğer eşleşmeleri dir2/*içine taşınacaktır.
    • Öğesinin son eşleşmesi dir2/*bir dosyaysa, yalnızca bir dosya eşleşmediği sürece muhtemelen bir hata mesajı alırsınız dir1/*.

$ cp dir1/* dir2-> cp: dir1/isadir is a directory (not copied).benim için durum 1 ile çıkar.
contrebis

1
Evet, benim için de durum 1 ile çıkıyor. Ancak yine de, kontrol ettiğim her sistemde cpeşleşen dosyaları kopyalar dir1/*: Arch Linux, Ubuntu 14.04, OpenBSD 3.9 ve 5.5, SuSE Linux 8.1, FreeBSD 6.2, Solaris 8, 9 ve 10 ( cpaslında kod 2'den çıkar). Yani bu davranış ne yeni (SuSE 8.1 2002'den itibaren) ne de Linux ile sınırlı. cpsıfır olmayan bir çıkış koduyla çıkar çünkü kendisine söylenen her şeyi yapamaz. Bu hiçbir şey yapmadığı anlamına gelmez .
Adaephon

3
Elbette, kayda değer bir şey düşündüm çünkü komutları bununla birlikte zincirliyorsanız &&bir soruna neden olabilir. Şu an bağlamı hatırlayamama rağmen böyle bir şey deniyordum.
contrebis

Bu gizli dosyaları kopyalamaz.
felwithe

@felwithe *Gizli dosyaların dahil edilip edilmeyeceği veya gizli dosyaların nasıl dahil edileceği kabuğa bağlıdır. Eğer *gizli dosyaları dahil değil, siz onları eşleşebilir .*. Bu içereceğini Not .ve ..üzerinde bashve dashancak üzerinde zsh. Bu cevap bağlamında cp dir1/* dir1/.* dir2kaçabilir .ve ..dizinlerdir ve kopyalanmayacaktır. zshile gizli dosyaları içerecek şekilde de yapılabilir *(D).
Adaephon

7

Komutları değil, joker karakterleri genişleten kabuk. Bu yüzden cp dir1/* dir2/*önce iki joker karakteri genişletir, ardından cpsonucu çağırır . Bu görünüşte beklediğiniz hiç değil: zaten var kaç dosya bağlı olarak dir2, dir2/*bir veya birden fazla argüman genişleyebilir. Komut cp, argümanlarından hangisinin ilk kalıbı genişletmekten, hangilerinin ikinci kalıbı genişletmekten geldiğini bilmez. Son argümanının hedef dizinin adı olmasını bekler. Böylece, dizinden tüm dosyaları kopyalamak için dir1dizine dir2, son argüman dizin olmalıdır dir2:

cp dir1/* dir2

Çünkü *tüm dosyalarla eşleşir, tüm dosyaları cpkopyalamaya çalışır. Bu dizinleri içerir: dizinler de dosyalardır. Dizinleri atlar, ancak bir hata bildirir. Adlandırılmış kanallar (bir şey onlara yazması daha iyi olmuş veya cpengellenecek) gibi özel dosyaların içeriğini kopyalar .

Yalnızca normal dosyaları kopyalamak için eşleşmeyi kısıtlamanız gerekir. Zsh'de, bunun için glob niteleyicisini kullanabilirsiniz .:

cp dir1/*(.) dir2

Diğer mermilerinde bu yok. findKomutu dosya türlerine filtre uygulamak için kullanabilirsiniz . Gömülü olmayan bir Linux veya Cygwin kullandığınızı varsayarsak:

find dir1 -maxdepth 1 -type f -exec cp -t dir2 {} +

Linux, FreeBSD ve OSX'te:

find dir1 -maxdepth 1 -type f | xargs -I {} cp {} dir2

Belirtmek için bir sebep var mı -maxdepth 1? Ayrıca, hedef dizindeki özgün dizin hiyerarşisini yinelemeli olarak kopyalamanın ve korumanın bir yolu var mı?
Abdull

@Abdull Olmazsa -maxdepth 1, findkomut burada istenmeyen alt dizinlere geri çekilirdi . Eğer alt dizinleri dahil olmak bütün dizin ağacı kopyalamak istiyorsanız, bu tamamen farklı bir soru ve cevabı çok basittir: cp -a dir1 dir2.
Gilles 'SO- kötü olmayı bırak'

0

Aşağıda dosyayı kaynaktan kaynaktan hedef dizine kopyalama komutu verilmiştir.

  1. Kaynak klasöre gidin ve aşağıdaki komutu yazın:

    $ cp fileName destination directory path

Misal:

cp publichOT.sh  /data/home/useradmin
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.