Yanıtlar:
Bir daha sorun aklıma geliyor cat
vs 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/s
boyutlandır - herhangi bir yer almamalıdır.
17> du -sh sparsetest
0 sparsetest
cp 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 sparsecat
davranış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.
cp
seyrek dosyalardaki davranışını kontrol etme seçeneği vardır; --sparse=never
komut satırında belirtildiği gibi, cp
bu kadar yavaştır cat
.
Göre Keith açıklama , cp
bazı izinler korur ve cat
yeni dosya oluşturur umask
gösterir. Yani $2
'ın izni olduğu korunmaz $4/vmlinuz
bazı garip izni üzerine ayarlanırsa iken, oldukça temiz $3
, $4/System.map
o devam edecektir.
cat
oruculuğunu atfetmenin nedeni bu mu?
cat
hı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
.
cat
gerç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.
cat
konsolla hiçbir ilgisi yok. Hem cat
ve 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. cp
daha 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 cat
rahatsı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.
cp
olmadan bazı izinleri -p
korur . Örneğin, kaynak dosya yürütülebilir durumdaysa, hedef dosyayı yürütülebilir hale getirir, ancak oluşturmaz . cp
cat
cp
dosyayı orijinalinecat
benzetirken aynı içeriğe sahip yeni bir dosya oluşturur.