cp vs cat pour copier un fichier

12

cp a bet cat a > bquelle est la différence?

Dans le script d'installation x86 de l'arborescence source du noyau linux ( arch/x86/boot/install.sh), les deux sont utilisés:

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

Pourquoi ne gardent-ils pas simplement le même format si l'un est meilleur que l'autre?

Qian
la source

Réponses:

15

Un autre problème me vient à l'esprit où catvs cpfait une différence significative:

Par définition, cat étendra les fichiers clairsemés, remplissant les lacunes avec de "vrais" octets zéro, tandis que cp au moins peut être invité à conserver les trous.

Les fichiers épars sont des fichiers dans lesquels des séquences de zéro octet ont été remplacées par des métadonnées pour préserver l'espace. Vous pouvez tester en créant un avec dd, et le dupliquer avec les outils de votre choix.

  1. Créez un fichier clairsemé (en changeant / tmp au préalable pour éviter les problèmes - voir note finale):

    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. dimensionnez-le - il ne devrait pas prendre de place.

    17> du -sh sparsetest
    0       sparsetest
    
  3. copiez-le avec cp et vérifiez la taille

    18> cp sparsetest sparsecp
    19> du -sh sparsecp
    0       sparsecp
    
  4. maintenant copiez-le avec le chat et vérifiez la taille

    20> cat sparsetest > sparsecat
    21> du -sh sparsecat
    1.3M    sparsecat
    
  5. essayez vos outils préférés pour vérifier leur comportement

  6. n'oubliez pas de nettoyer.

Note finale de prudence: des expériences comme celles-ci ont la chance inhérente d'augmenter votre renommée avec votre administrateur système local si vous les faites sur un système de fichiers qui fait partie de son plan de sauvegarde, ou critique pour le bien-être du système. Selon son choix d'outil de sauvegarde, il pourrait finir par avoir besoin de plus de supports de bande qu'il n'en avait jamais cru possible pour sauvegarder ce fichier de 0 octet qui est étendu à des téraoctets de zéros.

D'autres fichiers qui ne peuvent pas être copiés avec ni cat ni cp incluraient des fichiers spéciaux pour le périphérique, etc. Cela dépend de votre implémentation de l'outil de copie s'il est capable de dupliquer le nœud du périphérique, ou s'il copierait gaiement son contenu à la place.

Tatjana Heuser
la source
1
Crée donc cpun fichier comme l'original, tout en catcréant un nouveau fichier avec le même contenu.
Qian
Les deux outils fonctionnent sur le contenu, mais cp (au moins les implémentations "modernes") connaît de nos jours certaines spécialités, comme les trous (les anciennes implémentations de cat se retrouveront dans ce piège). Il existe également des systèmes de fichiers qui ne connaissent pas le concept de fichiers épars, par exemple HFS + (MacOS) ou FAT (MSDOS, clés USB, etc.), ce qui les fait exploser à leur taille maximale. Il y a donc des constellations où cp ou cat ne feront aucune différence dans la pratique.
Tatjana Heuser
De plus, GNU cpa une option pour contrôler son comportement sur les fichiers épars; comme, avec --sparse=neverspécifié sur la ligne de commande, cpest aussi lent que cat.
oguz ismail
6

Selon le commentaire de Keith , cpconserve certaines autorisations et catcrée le nouveau fichier comme umaskindiqué. Donc, $2la permission n'est pas préservée, ce qui $4/vmlinuzest assez propre, tandis que si une permission étrange est activée $3, $4/System.mapelle le gardera.

TheoYou
la source
est - ce la raison pour attribuer catla rapidité d '?
Nikhil Mulley
2
Est-ce catplus rapide?
Qian
4

Les deux ont des fonctionnalités équivalentes dans ces deux cas, mais cp est purement une opération de fichier. "Prenez ce fichier et faites-en une copie là-bas".

cat, d'autre part, est destiné à vider le contenu d'un fichier sur la console. "Prenez ce fichier et affichez-le à l'écran" puis demandez à un ninja d'attaquer l'écran et de rediriger la sortie ailleurs.

cp serait généralement plus efficace, car il n'y a pas de redirection uniquement, simplement une copie directe des octets de l'emplacement A vers l'emplacement B.

le chat serait read bytes -> output to console -> intercept output -> redirect to new file.


la source
3
catne sera pas vraiment output to console -> intercept output -> redirect to new file, le fichier de sortie pour cat peut être stdout ou un fichier normal, il ne fera que sortir dans le fichier, tant que l'entrée n'est pas la même que la sortie.
4
catn'a rien à voir avec la console. Les deux catet cplisent à partir du fichier d'entrée et écrivent dans le fichier de sortie. Avec cat, le fichier de sortie est ouvert par le shell, tandis qu'avec cp, le fichier de sortie est ouvert par cp; cela ne fait aucune différence dans les performances. cppeut être plus rapide, mais pour une raison complètement différente: certaines implémentations de cptentent de deviner la bonne taille de bloc pour les performances en fonction des appareils source et cible; une mise en œuvre de catne dérangerait pas.
Gilles 'SO- arrête d'être méchant'
2

C'est vraiment une question de préférence, à mon humble avis.

Il n'y a techniquement aucune différence réelle à moins que vous n'utilisiez la commande cp avec le commutateur -p pour conserver la propriété / le groupe de fichiers. Sinon, c'est la même chose fonctionnellement. La réponse de Marc est beaucoup plus claire et précise.

Jeu de quilles
la source
3
cpsans -pne conserve certaines autorisations. Par exemple, si le fichier source est exécutable, cple fichier cible catsera exécutable, mais ne le sera pas.
Keith Thompson
Bon point! Il vmlinuzne sera donc pas exécutable $2.