Yanıtlar:
Bir daha sorun aklıma geliyor catvs cpönemli bir fark yapar:
Tanım olarak, kedi seyrek dosyaları genişletecek, boşlukları "gerçek" sıfır bayt ile dolduracak, cp en azından delikleri korumak için söylenebilir.
Seyrek dosyalar, alanı korumak için sıfır baytlık dizilerin meta verilerle değiştirildiği dosyalardır. Dd ile bir tane oluşturarak test edebilir ve istediğiniz araçlarla çoğaltabilirsiniz.
Seyrek bir dosya oluşturun (sorunu önlemek için önceden / tmp olarak değiştirin - son nota bakın):
15> cd /tmp
16> dd if=/dev/null of=sparsetest bs=512b seek=5
0+0 records in
0+0 records out
0 bytes (0 B) copied, 5.9256e-05 s, 0.0 kB/sboyutlandır - herhangi bir yer almamalıdır.
17> du -sh sparsetest
0 sparsetestcp ile kopyala ve boyutu kontrol et
18> cp sparsetest sparsecp
19> du -sh sparsecp
0 sparsecpşimdi kedi ile kopyala ve boyutu kontrol et
20> cat sparsetest > sparsecat
21> du -sh sparsecat
1.3M sparsecatdavranışlarını kontrol etmek için tercih ettiğiniz araçları deneyin
temizlemeyi unutma.
Son uyarı: Bunun gibi deneyler, yedekleme planının bir parçası olan veya sistemin iyiliği için kritik olan bir dosya sisteminde yapıyorsanız, yerel sistem yöneticinizle şöhretinizi artırma şansına sahiptir. Yedekleme aracı seçimine bağlı olarak, terabayt sıfıra kadar genişleyen 0 baytlık bir dosyayı yedeklemek için mümkün olduğunu düşündüğünden daha fazla teyp ortamına ihtiyaç duyabilir.
Ne cat ne de cp ile kopyalanamayan diğer dosyalar cihaza özel dosyalar vb. İçerir. Bu, cihaz düğümünü çoğaltabiliyorsa veya bunun yerine içeriğini nadiren kopyalayıp kopyalayamayacağı kopyalama aracı uygulamanıza bağlıdır.
cpseyrek dosyalardaki davranışını kontrol etme seçeneği vardır; --sparse=neverkomut satırında belirtildiği gibi, cpbu kadar yavaştır cat.
Göre Keith açıklama , cpbazı izinler korur ve catyeni dosya oluşturur umaskgösterir. Yani $2'ın izni olduğu korunmaz $4/vmlinuzbazı garip izni üzerine ayarlanırsa iken, oldukça temiz $3, $4/System.mapo devam edecektir.
catoruculuğunu atfetmenin nedeni bu mu?
cathızlı?
Her ikisi de bu iki durumda eşdeğer işlevselliğe sahiptir, ancak cp tamamen bir dosya işlemidir. Msgstr "Bu dosyayı al ve orada bir kopyasını oluştur".
cat ise, bir dosyanın içeriğini konsola dökmeyi amaçlamaktadır. "Bu dosyayı al ve ekranda göster" ve ardından bir ninja ekrana saldırıp çıktıyı başka bir yere yönlendir.
cp genellikle daha verimli olur, çünkü yalnızca yeniden yönlendirme olmaz, yalnızca baytların A konumundan B konumuna doğrudan kopyalanması.
kedi olur read bytes -> output to console -> intercept output -> redirect to new file.
catgerçekten olmaz output to console -> intercept output -> redirect to new file, cat için çıktı dosyası stdout veya normal bir dosya olabilir, giriş çıktıyla aynı olmadığı sürece sadece dosyaya çıkar.
catkonsolla hiçbir ilgisi yok. Hem catve cpçıkış dosyasına girdi dosyası ve yazma okunan. İle catçıktı dosyası kabuk tarafından açılırken cp, ile çıktı dosyası tarafından açılır cp; bu performansta bir fark yaratmaz. cpdaha hızlı olabilir, ancak tamamen farklı bir nedenden dolayı: bazı uygulamalar cp, kaynak ve hedef cihazlara bağlı olarak performans için doğru yığın boyutunu tahmin etmeye çalışır; bir uygulama catrahatsız olmaz.
Bu gerçekten bir tercih meselesi, IMHO.
Dosya sahipliğini / grubunu korumak için -p anahtarıyla cp komutunu kullanmadığınız sürece teknik olarak gerçek bir fark yoktur. Aksi takdirde, işlevsel olarak aynı şeydir. Marc'ın yanıtı çok daha açık bir şekilde ayrıntılı ve doğrudur.
cpolmadan bazı izinleri -pkorur . Örneğin, kaynak dosya yürütülebilir durumdaysa, hedef dosyayı yürütülebilir hale getirir, ancak oluşturmaz . cpcat
cpdosyayı orijinalinecatbenzetirken aynı içeriğe sahip yeni bir dosya oluşturur.