Dizin 1'in 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 dizinler sorunum var.
Ayrıca, tüm dosyalarımın herhangi bir uzantısı yok, bu yüzden . iş görmez
cp dir1/* dir2
cp, açıkça söylenmediği sürece dizinleri kopyalamaz (örneğin
--recursiveile, bkz.
man cp`).
Not 1: cp
büyük olasılıkla sıfır olmayan bir durumla çıkacaktır, ancak dosyalar yine de kopyalanmış olacaktır. Bu, çıkış kodlarına dayalı komutları zincirleme yaparken bir sorun olabilir: &&
, ||
, if cp -r dir1/* dir2; then ...
, etc. (Bu konudaki yorumları için contrebis'e teşekkürler](https://unix.stackexchange.com/questions/101916/copy-only-regular-files-from-one-directory-to-another/101923?noredirect=1#comment459686_101923))
Not 2: cpson parametrenin tek bir dosya adı veya dizin olmasını bekler. Hedef dizinin adından sonra gerçekten
joker karakteri olmamalıdır. dir2\*
kabuk tarafından tıpkı dir1\*
gibi genişletilecektir. Beklenmedik şeyler olacaktır*:
dir2
boşsa ve kabuğunuza ve ayarlarınıza bağlıysa:dir2/*
harfi harfine alınacaktır (*
adında bir dosya/dizin aranacaktır), bu da *
gerçekten mevcut değilse muhtemelen bir hataya yol açacaktır.dir2/*
komuttan tamamen çıkarılacak ve geriye cp dir1/*
kalacaktır. Bu da dir1/*
'in genişlemesine bağlı olarak veriyi yok edebilir:dir1/*
sadece bir dosya ya da dizinle eşleşirse, cp
komutundan bir hata alırsınız.dir1/*
tam olarak iki dosya ile eşleşirse, birinin üzerine diğeri yazılacaktır (Kötü).dir/*
birden fazla dosyayla eşleşirse ve son eşleşme a ise, bir hata mesajı alırsınız.dir/*
dosyasının son eşleşmesi bir dizin ise, diğer tüm eşleşmeler bu dizine taşınacaktır.dir2
boş değilse, bu yine değişir:dir2/*
son eşleşmesi bir dizin ise, dir1/*
ve diğer dir2/*
eşleşmeleri içine taşınacaktır.dir2/*
dosyasının son eşleşmesi bir dosyaysa, muhtemelen bir hata mesajı alırsınız, eğer `dir1/` sadece bir dosyayla eşleşmiyorsa.Joker karakterleri genişleten kabuktur, komutlar değil. Yani cp dir1/* dir2/*
önce iki joker karakteri genişletir, sonra sonuç üzerinde cp
çağırır. Bu hiç de beklediğiniz gibi değildir: dir2
içinde kaç dosya olduğuna bağlı olarak, dir2/*
bir veya daha fazla argümana genişleyebilir. cpkomutu, argümanlarından hangilerinin ilk kalıbın genişletilmesinden, hangilerinin ikinci kalıbın genişletilmesinden geldiğini bilmez. Son argümanının hedef dizinin adı olmasını bekler. Böylece,
dir1dizinindeki tüm dosyaları
dir2dizinine kopyalamak için, son argüman
dir2` dizini olmalıdır:
cp dir1/* dir2
*tüm dosyalarla eşleştiğinden,
cptüm dosyaları kopyalamaya çalışır. Buna dizinler de dahildir: dizinler de dosyadır. Dizinleri atlar, ancak bir hata bildirir. Adlandırılmış borular gibi özel dosyaların içeriğini kopyalar (bunlara bir şey yazılsa iyi olur, yoksa
cp` bloke olur), vb.
Yalnızca düzenli dosyaları kopyalamak için eşleştirmeyi kısıtlamanız gerekir. Bunun için zsh'de glob niteleyicisi .
kullanabilirsiniz:
cp dir1/*(.) dir2
Diğer kabuklarda bu özellik yoktur. Dosya türlerini filtrelemek için find
komutunu kullanabilirsiniz. Gömülü olmayan Linux veya Cygwin çalıştırdığınızı varsayarsak:
find dir1 -maxdepth 1 -type f -exec cp -t dir2 {} +
Linux, FreeBSD ve OSX üzerinde:
find dir1 -maxdepth 1 -type f | xargs -I {} cp {} dir2
Aşağıda kaynak dizinden hedef dizine dosya kopyalama komutu verilmiştir.
Kaynak klasörüne gidin ve aşağıdaki komutu yazın:
$ cp dosyaAdı hedef dizin yolu
Örnek:
cp publichOT.sh /data/home/useradmin