web-dev-qa-db-fra.com

Écrire n octets d'un fichier dans une autre à bash

Bonjour Comment puis-je écrire n octets d'un fichier dans un nouveau fichier à partir de la position k position à l'aide de bash?

  • Par exemple, si N = 60, K = 1 et Taille du fichier = 100 Ensuite, le 2e fichier serait composé de la 1ère octet jusqu'à la 60e octet et serait de 60 octets de taille
  • Par exemple, si N = 40, K = 61 et Taille du fichier = 100 Ensuite, le 2e fichier serait composé de la 61e octet jusqu'à l'octet 100ème octet et serait de 40 octets de taille

Peut-être que nous travaillons avec des fichiers binaires non ASCII fichiers, de sorte que la concaténation de 2 moitiés doit être identique au fichier d'origine!

(Est-ce possible avec dd?)

10
PiNewbie

Oui. Par la page page DD Man , vous recherchez quelque chose comme:

dd bs=1 count=60 if=_filename_1_ of=_filename_2_
dd bs=1 skip=60 count=40 if=_filename_1_ of=_filename_2_

_filename_n_ est remplacé par un nom de fichier réel.

bs=1 signifie que count et skip sont comptes d'octets. skip est combien de sauter; count est combien de copier. Editer Les comptes octets commencent à 0, pas 1. Par conséquent, pour commencer à la première octet, utilisez skip=0 (ou laisser skip non spécifié).

En tant que fonction Bash, vous pouvez utiliser:

# copy_nk(n, k, infile, outfile)
copy_nk() {
    dd bs=1 count="$1" skip="$2" ${3:+if="$3"} ${4:+of="$4"}
}

puis appelez-le comme

copy_nk 60 0 infile.txt outfile.txt

(avec k = 0 Parce que les numéros d'octets commencent à zéro).

Avec le ${3:+...}, vous pouvez laisser le fichier de sortie ou le fichier d'entrée. Par exemple.,

cat infile.txt | copy_nk 60 0 > outfile.txt
12
cxw

Voici une autre approche utilisant head et Bash Command Groups:

{ head -c60 > /dev/null ; head -c40 > output.txt ; } < input.txt

Le premier head ici lit les 60 premiers octets d'INPUT.TXT et l'envoie au godet de bits.

Parce que ces commandes head sont dans le groupe de commandes, la position du fichier dans INPUT.TXT sera préservée. Ainsi, la seconde head _ va lire les 40 octets suivants (à partir d'un octet 61 à 100 à l'aide d'une indexation basée sur 1) et écrivez-le à la sortie.txt.


En fait, cette méthode peut être généralisée pour donner une fonctionnalité split- comme une fonctionnalité, mais avec l'avantage supplémentaire de pouvoir spécifier la longueur de chaque fichier de sortie. Supposons que nous ayons un fichier de 100 octets que nous voulons diviser en morceaux de tailles 7, 50, 23 et le reste. Nous pourrions faire:

{
    head -c7 > 7bytes.txt
    head -c50 > 50bytes.txt
    head -c23 > 23bytes.txt
    cat > remaining-bytes.txt
} < input.txt
6
Digital Trauma