40 votes

Comment produire un fichier à partir du décalage spécifié, mais pas avec "dd bs=1 skip=N"?

Comment faire quelque chose comme dd if=somefile bs=1 skip=1337 count=31337000, mais efficacement, sans utiliser de lectures et écritures d'un octet ?

La solution attendue est :

  1. D'être simple (pour du non-simple je peux écrire une ligne de code Perl qui fera cela)
  2. De supporter de grands décalages et longueurs (donc les astuces avec la taille des blocs dans dd ne seront pas utiles)

Solution partielle (pas assez simple, essayer la même chose avec la longueur rendrait cela encore plus complexe) :

dd if=somefile bs=1000 skip=1 count=31337 | { dd bs=337 count=1 of=/dev/null; reste_du_pipeline; }
# 1337 div 1000 and 1337 mod 1000

53voto

Fabiano Points 676

Cela devrait le faire (sur gnu dd) :

dd if=somefile bs=4096 skip=1337 count=31337000 iflag=skip_bytes,count_bytes

Si vous utilisez également seek=, vous pouvez également envisager oflag=seek_bytes.

De info dd :

`count_bytes'
      Interprète l'opérande `count=' comme un compte de bytes, plutôt qu'un compte de blocs, ce qui permet de spécifier une longueur qui n'est pas un multiple de la taille de bloc d'E/S.  Ce drapeau ne peut être utilisé qu'avec `iflag'.

`skip_bytes'
      Interprète l'opérande `skip=' comme un compte de bytes, plutôt qu'un compte de blocs, ce qui permet de spécifier un décalage qui n'est pas un multiple de la taille de bloc d'E/S.  Ce drapeau ne peut être utilisé qu'avec `iflag'.

`seek_bytes'
      Interprète l'opérande `seek=' comme un compte de bytes, plutôt qu'un compte de blocs, ce qui permet de spécifier un décalage qui n'est pas un multiple de la taille de bloc d'E/S.  Ce drapeau ne peut être utilisé qu'avec `oflag'.

Ps : Je comprends que cette question est ancienne et il semble que ces drapeaux ont été implémentés après que la question ait été posée à l'origine, mais comme c'est l'un des premiers résultats de recherche sur Google pour une recherche dd connexe que j'ai faite, j'ai pensé qu'il serait bon de le mettre à jour avec la nouvelle fonctionnalité.


Remarque : cette réponse s'applique uniquement à GNU dd, utilisé par la plupart des distributions Linux, il fait partie du paquet GNU coreutils, cette fonctionnalité a été introduite dans la version 8.16 des coreutils (2012-03-26, quelques mois après que la question initiale ait été répondue).

Remarque pour les utilisateurs de Mac : MacOS utilise une variante basée sur bsd des utilitaires unix (principalement pour des raisons de licence), mais les versions GNU des utilitaires unix en général ont un développement beaucoup plus actif et ont généralement beaucoup plus de fonctionnalités. Vous pouvez installer GNU coreutils sur Mac avec Homebrew : brew install coreutils.

2voto

RolKau Points 896

Utilisez un processus pour éliminer tous les octets initiaux, puis un second pour lire les octets réels, par exemple :

echo Bonjour le monde\! | ( dd of=/dev/null bs=7 count=1 ; dd bs=5 count=1 )

Le deuxième dd peut lire l'entrée avec une taille de bloc que vous trouvez efficace. Notez que cela nécessite un processus supplémentaire à être lancé ; selon votre système d'exploitation, cela entraînera un coût, mais il est probablement plus petit que de devoir lire les fichiers un par un octet (à moins que vous n'ayez un fichier très petit, auquel cas il n'y aurait pas de problème).

1voto

Federico Points 300

Au lieu de bs=1, utilisez bs=4096 ou plus.

1voto

Vous pouvez essayer la commande hexdump :

hexdump  -v  -c -n  -s 

Si vous voulez simplement voir le contenu :

#/usr/bin/hexdump -v -C mycorefile -n 100 -s 100
00000064 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 
00000074 00 00 00 00 01 00 00 00 05 00 00 00 00 10 03 00 |................| 
00000084 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 |......@.........| 
00000094 00 00 00 00 00 00 00 00 00 00 00 00 00 a0 03 00 |................| 
000000a4 00 00 00 00 00 10 00 00 00 00 00 00 01 00 00 00 |................| 
000000b4 06 00 00 00 00 10 03 00 00 00 00 00 00 90 63 00 |..............c.| 
000000c4 00 00 00 00 |....| 
000000c8 #

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X