Comment faire des choses comme dd if=somefile bs=1 skip=1337 count=31337000
, mais efficacement, sans utiliser des lectures et des écritures non à 1 octet?
La solution est attendue:
- Pour être simple (pour les non-simples, je peux écrire un onliner Perl qui le fera)
- Pour prendre en charge les grands décalages et longueurs (donc les hacks avec une taille de bloc en dd ne seront pas utiles)
Solution partielle (pas assez simple, essayer la même chose avec la longueur le rendra encore plus complexe):
dd if=somefile bs=1000 skip=1 count=31337 | { dd bs=337 count=1 of=/dev/null; rest_of_pipeline; }
# 1337 div 1000 and 1337 mod 1000
Réponses:
Cela devrait le faire (sur gnu dd):
Si vous utilisez
seek=
également, vous pouvez également envisageroflag=seek_bytes
.De
info dd
:Ps: Je comprends que cette question est ancienne et il semble que ces indicateurs aient été mis en œuvre après la question posée à l'origine, mais comme il s'agit de l'un des premiers résultats de Google pour une recherche dd connexe que j'ai faite, je pensais que ce serait bien de mettre à jour avec la nouvelle fonctionnalité.
la source
Utilisez un processus pour abandonner tous les octets initiaux, puis un second pour lire les octets réels, par exemple:
Le second
dd
peut lire l'entrée avec n'importe quelle taille de bloc que vous trouvez efficace. Notez que cela nécessite un processus supplémentaire pour être généré; en fonction de votre système d'exploitation, cela entraînera un coût, mais il est probablement plus petit que d'avoir à lire les fichiers un par un (sauf si vous avez un très petit fichier, auquel cas il n'y aurait pas de problème).la source
dd if=/dev/sda bs=10000000001 | dd bs=255 count=1 | hd
-> "dd: numéro invalide` 10000000001 '"dd if=/dev/sda bs=16M skip=596 count=1 | dd bs=512 skip=1522 count=1 | (dd bs=1 count=1 of=/dev/null ; dd bs=255 count=1)
read -n
pour sauter? Et puishead -c
compter? Par exemple,cat somefile | (read -n 1337; head -c 31337000)
ou vous pouvez le faire sans engendrer un processus supplémentaire:exec 3<somefile; read -n 1337 -u 3; head -c 31337000 <&3
Au lieu d'
bs=1
utiliserbs=4096
ou plus.la source
f.seek(1337)
avant d'utiliserread(MY_CHUNK_SIZE)
Vous pouvez essayer la commande hexdump:
Si vous voulez simplement voir le contenu:
la source