J'ai récemment réalisé que nous pouvions utiliser cat
autant que dd
, et c'est en fait plus rapide quedd
Je sais que cela a dd
été utile pour traiter les bandes où la taille du bloc importait réellement, pas seulement la performance. De nos jours, cependant, y a-t-il des situations où dd
on peut faire quelque chose ne cat
peut pas? (Dans ce cas, une différence de performance inférieure à 20% serait sans importance.)
Des exemples concrets seraient bien!
Réponses:
En apparence,
dd
est un outil d’un système d’exploitation IBM qui conserve son apparence étrangère (son passage de paramètres), qui exécute des fonctions très rarement utilisées (telles que les conversions EBCDIC en ASCII ou l’inversion d’endianisme… n’est plus un besoin courant de nos jours).J'avais l' habitude de penser que
dd
c'était plus rapide pour copier de gros blocs de données sur le même disque (grâce à une utilisation plus efficace de la mise en mémoire tampon), mais ce n'est pas vrai , du moins sur les systèmes Linux actuels.Je pense que certaines des
dd
options de sont utiles pour les bandes, où la lecture se fait en bloc (les pilotes de bande ne cachent pas les blocs sur le support de stockage comme le font les pilotes de disque). Mais je ne connais pas les détails.Une chose à
dd
faire qui ne peut (facilement) être réalisée par aucun autre outil POSIX est de prendre les N premiers octets d’un flux. Beaucoup de systèmes peuvent le faire avechead -c 42
, maishead -c
, bien que commun, ce n'est pas dans POSIX (et n'est pas disponible aujourd'hui par exemple sur OpenBSD). (tail -c
is POSIX.) De plus, même là où ilhead -c
existe, il risque de lire trop d'octets de la source (car il utilise la mise en tampon stdio en interne), ce qui pose un problème si vous lisez un fichier spécial dans lequel la lecture a un effet. (Les coreutils actuels de GNU lisent le nombre exact avechead -c
, mais FreeBSD et NetBSD utilisent stdio.)Plus généralement,
dd
donne une interface à l'API de fichier sous-jacente unique parmi les outils Unix: seulsdd
peuvent écraser ou tronquer un fichier à tout moment ou rechercher dans un fichier. (C’estdd
une capacité unique et elle est importante; curieusement, elledd
est mieux connue pour ce que d’autres outils peuvent faire.)>
redirection dans le shell.>>
redirection dans le shell ou avectee -a
.Si vous souhaitez raccourcir un fichier en supprimant toutes les données après un certain point , cela est pris en charge par le noyau sous-jacent et l'API C via la
truncate
fonction, mais n'est exposé par aucun outil de ligne de commande, à l' exception des éléments suivantsdd
:Si vous souhaitez écraser des données au milieu d'un fichier, cela est à nouveau possible dans l'API underyling en ouvrant le fichier en écriture sans le tronquer (et en appelant
lseek
pour vous déplacer si nécessaire), mais vousdd
pouvez uniquement ouvrir un fichier sans tronquer ou ajouter, ou chercher dans le shell ( exemple plus complexe ).Alors… En tant qu'outil système,
dd
c'est quasiment inutile. En tant qu'outil de traitement de texte (ou de fichier binaire), il est très utile!la source
trunc
et qu'ilseek
est utilisable depuisdd
).dd
peut lire des données binaires à partir de descripteurs de fichiers non lisibles sans potentiellement détruire les données non lues en raison de la mise en mémoire tampon stdio Voir ici pour un exemple: etalabs.net/sh_tricks.htmlhead -c N
appelleread
et ne dépasse jamais N. Dans NetBSD 5.1,head -c
appellegetc
. Dans FreeBSD 7.4,head -c
appellefread
.dd
expose également O_DIRECT (etc.) pour les scripts shell, qui je pense est également unique.truncate
permet de tronquer ou d'étendre des fichiers, éliminant ainsi une autre utilisation dedd
.La
dd
commande inclut BEAUCOUP d’options que cat ne peut pas prendre en charge. Peut-être que dans vos cas d'utilisation, cat est un substitut utilisable, mais ce n'est pas un substitut du DD.Un exemple serait d'utiliser
dd
pour copier une partie de quelque chose mais pas le tout. Peut-être voudrez-vous extraire certains des bits du milieu d'une image ISO ou de la table de partition d'un disque dur en fonction d'un emplacement connu sur le périphérique. Avec,dd
vous pouvez spécifier les options de démarrage, d'arrêt et de quantité permettant ces actions.Ces options
dd
rendent indispensable la manipulation de données à granulométrie fine, alors quecat
* ne peut fonctionner que sur des objets, périphériques ou flux de fichiers entiers.* Comme l’a noté Gilles dans les commentaires, il est possible de combiner
cat
avec d’autres outils pour isoler des parties de quelque chose, maiscat
fonctionne toujours sur l’objet entier.la source
dd
n’a en fait rien à voir avec les périphériques de bas niveau, il a besoin d’une entrée/dev
comme les autres. Vous pouvez copier une partition entièrecat
ou une partie de celle-ci avectail +c $(($start+1)) | head -c $count
.cat | head | tail
pour récupérer les derniers MB, le disque qui tourne aspire la lune plus près de la Terre.Personne n’a encore indiqué que vous pouvez utiliser dd pour créer des fichiers fragmentés , même s’ils
truncate
peuvent également être utilisés aux mêmes fins.Ceci est presque instantané et crée un fichier volumineux arbitraire qui peut être utilisé comme fichier de bouclage, par exemple:
La bonne chose est qu’elle n’utilise au départ qu’un seul bloc d’espace disque, puis ne croît que si nécessaire (le formatage ext4 d’un fichier de 10 Go consomme 291 Mo sur mon système). Utilisez cette option
du
pour voir la quantité réellement utilisée d'espace disque.ls
Indique uniquement la taille maximale du fichier.la source
ls -ls
vous montre la taille clairsemée.dd of=sparse-file bs=1 count=0 seek=10G
serait équivalent àtruncate -s 10GB sparse-file
. Assez de prêter à confusion,truncate
etdd
ont l' interprétation exacte opposé deGB
contreG
...man dd
dit:MB =1000*1000, M =1024*1024
et ainsi de suite. Etman truncate
dit:MB 1000*1000, M 1024*1024
Donc, il n'y a pas de différence. J'utilise les deuxdd
ettruncate
de la coreutils GNU. Tu devrais le faire aussi! :-)Remplacer des segments spécifiques d’un disque dur par quelque chose est un exemple courant. Par exemple, vous voudrez peut-être supprimer votre MBR à l'aide de cette commande:
Aussi, vous pouvez créer des fichiers vides avec (par exemple pour les images de disque en boucle):
la source
head -c
? S'il vous plaît partager un point de repère !dd
est très utile pour sauvegarder le secteur de démarrage d'un disque dur ou d'un autre périphérique de stockage (dd if=/dev/sda of=boot_sector.bin bs=512 count=1
), puis pour le réécrire ultérieurement (dd if=boot_sector.bin of=/dev/sda
). Il est également utile pour la sauvegarde des en-têtes de volumes chiffrés.cat
pourrait être capable de le faire mais je n’aurais pas confiance en la partie réécriture. Il est difficile decat
ne lire / écrire qu'un certain nombre d'octets.la source
J'avais récemment eu raison de cloner des partitions de plusieurs centaines de Go pour la première fois de mon histoire de linuxing (cf
cp -ar
oursync
qui m'ont bien servi à plusieurs reprises). Bien sûr, je me suis tourné versdd
«parce que tout le monde sait que c'est ce que vous utilisez ... et j'ai été choqué par la performance. Un peu de googler m’a bientôt conduitddrescue
, que j’ai utilisé plusieurs fois et qui fonctionne très bien (beaucoup plus vite que dd).la source
ddrescue
est formidable, notamment pour extraire des données de disques défaillants.Voici quelques astuces que j'ai trouvées au fil des ans.
Couper-coller en mode non-interactif ou non-interactif bash
Si vous êtes dans une situation où EOF / ^ D / ^ F n'est pas détecté, vous pouvez utiliser dd pour transférer des fichiers texte sur un hôte. Puisqu'il arrêtera de lire automatiquement après une quantité d'octets spécifiée.
Je l’utilisais aussi récemment que l’année dernière lors d’un exercice de sécurité au cours duquel nous pouvions obtenir des shells non-tty sur un hôte distant et que nous devions transférer des fichiers.
En fait, j'ai même créé quelques fichiers binaires en les encodant en base64 et en utilisant un script de décodage base64 lent-fiable, mais fiable.
Une astuce géniale est que pendant que dd est en cours d’exécution, si vous lui envoyez un signal USR1, il émettra son statut actuel (octets lus, octets par seconde, etc.).
Filtre d'état de débit universel
J'ai écrit ceci pour agir comme un filtre de progrès pur bash pour tout programme qui émet des données via stdout. (Remarque: à peu près tout ce qui émettra des données via stdout - pour les programmes qui ne le font pas, vous pouvez tricher s'ils ne vous critiquent pas en utilisant / dev / stdout en tant que nom de fichier. Mais l'idée est fondamentalement que chaque fois que vous obtenez X nombre d'octets, marques de hachage d'impression (comme l'ancien FTP de l'école lorsque le mode de hachage était activé)
(Note) Le dossier de progression est boiteux, c'était principalement une preuve de concept. Si je le refais, je n'utiliserais qu'une variable.
fichiers slice-and-dice utilisant des descripteurs de fichiers shell anonymes
Voici un exemple extrêmement pseudo-code de la manière dont vous pouvez obtenir un fichier tar signé que vous pouvez extraire sans erreur en fournissant une entrée tar via un descripteur de fichier anonyme - sans utiliser de fichier tmp pour stocker des données de fichier partielles.
Le tl; dr est: je trouve que dd est incroyablement utile. Et ce ne sont que les trois exemples auxquels je peux penser de façon spontanée.
la source
Vous pouvez rediriger certains contenus de sortie. C'est particulièrement utile si vous avez besoin d'écrire avec
sudo
:En plus
sudo
c'est équivalent à:ou à ceci:
la source