Bonjour Comment puis-je écrire n
octets d'un fichier dans un nouveau fichier à partir de la position k
position à l'aide de bash?
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
?)
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_
où _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
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