bir dosyayı kopyalamak için cp vs. cat


12

cp a bve cat a > bfark nedir?

Linux kernel'in kaynak ağacının ( arch/x86/boot/install.sh) x86 kurulum betiğinde her ikisi de kullanılır:

cat $2 > $4/vmlinuz
cp $3 $4/System.map

Biri diğerinden daha iyiyse neden sadece aynı formatta kalmıyorlar?

Yanıtlar:


15

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.

  1. 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
  2. boyutlandır - herhangi bir yer almamalıdır.

    17> du -sh sparsetest
    0       sparsetest
  3. cp ile kopyala ve boyutu kontrol et

    18> cp sparsetest sparsecp
    19> du -sh sparsecp
    0       sparsecp
  4. şimdi kedi ile kopyala ve boyutu kontrol et

    20> cat sparsetest > sparsecat
    21> du -sh sparsecat
    1.3M    sparsecat
  5. davranışlarını kontrol etmek için tercih ettiğiniz araçları deneyin

  6. 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.


1
Aynı cpdosyayı orijinaline catbenzetirken aynı içeriğe sahip yeni bir dosya oluşturur.
Qian

Her iki araç da içerik üzerinde çalışır, ancak cp (en azından "modern" uygulamalar) bugünlerde delikler gibi bazı uzmanlıkların farkındadır (kedinin eski uygulamaları bu tuzağa girecektir). Ayrıca, HFS + (MacOS) veya FAT (MSDOS, USB-Sticks, vb.) Gibi seyrek dosyalar kavramının farkında olmayan dosya sistemleri de vardır, bu da bunların tam boyutlarına kadar şişmesine neden olur. Yani cp veya cat'in pratikte fark yaratmayacağı takımyıldızlar var.
Tatjana Heuser

Btw, GNU'nun 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.
oguz ismail

6

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?
Nikhil Mulley

2
cathızlı?
Qian

4

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.


3
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.

4
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.
Gilles 'SO- kötü olmayı bırak'

2

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.


3
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
Keith Thompson

İyi bir nokta! Öyleyse vmlinuz, çalıştırılabilir olmayacak $2.
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.