Bonjour.

Je veux découper des fichiers, mais comme j'ai besoin d'avoir plus de contrôle sur le fichier que ne le permet split, j'utilise dd.

Mais visiblement quelque chose m'échappe dans son utilisation.
Voici une partie de mon code (au besoin je peux le poster au complet)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
      dd if="$target" bs=$size count=1 of="$filename.001"
      echo 'premier fichier done'
 
      for x in $(seq 2 $numFiles)       
 
      do
         if (( x < 10 )) ; then
            prefix="00"
         elif (( x < 100 )) ; then
            prefix="0"
         else
            prefix=
         fi
 
         skipValue=$((( (x-1)*size )))
         echo "skip value = $skipValue"
 
         dd if="$target" bs=$size count=1 skip=$skipValue of="$filename.${prefix}$x"
         echo 'done'
      done
target -> chemin absolu du fichier à découper
size -> taille en octets qui sert de références pour les tailles de portions à créer (une fois définie ne varie jamais)
numFiles -> nombre de portions à créer (en fonction de la taille du fichier à découper et de size)

Et voici ce que ca peut donner comme résultat avec un fichier de 4.4 Gio nommé monFichier et size = 666 mio :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
1+0 enregistrements lus
1+0 enregistrements écrits
698351616 octets (698 MB) copiés, 8,90638 s, 78,4 MB/s
premier fichier done
skip value = 698351616
dd: «/media/Data/JD/monFichier»*: ne peut pas ignorer jusqu'au décalage indiqué
0+0 enregistrements lus
0+0 enregistrements écrits
0 octet (0 B) copié, 0,000295359 s, 0,0 kB/s
done
skip value = 1396703232
dd: «/media/Data/JD/monFichier»*: ne peut pas ignorer jusqu'au décalage indiqué
0+0 enregistrements lus
0+0 enregistrements écrits
0 octet (0 B) copié, 0,000251568 s, 0,0 kB/s
done
skip value = 2095054848
dd: «/media/Data/JD/monFichier»*: ne peut pas ignorer jusqu'au décalage indiqué
0+0 enregistrements lus
0+0 enregistrements écrits
0 octet (0 B) copié, 0,000249752 s, 0,0 kB/s
done
skip value = 2793406464
dd: «/media/Data/JD/monFichier»*: ne peut pas ignorer jusqu'au décalage indiqué
0+0 enregistrements lus
0+0 enregistrements écrits
0 octet (0 B) copié, 0,000256178 s, 0,0 kB/s
done
skip value = 3491758080
dd: «/media/Data/JD/monFichier»*: ne peut pas ignorer jusqu'au décalage indiqué
0+0 enregistrements lus
0+0 enregistrements écrits
0 octet (0 B) copié, 0,000272591 s, 0,0 kB/s
done
skip value = 4190109696
dd: «/media/Data/JD/monFichier»*: ne peut pas ignorer jusqu'au décalage indiqué
0+0 enregistrements lus
0+0 enregistrements écrits
0 octet (0 B) copié, 0,000254432 s, 0,0 kB/s
done
Vous l'aurez compris, mon erreur se situe au niveau de la ligne 18 du code.

Peut être que le skip est trop grand et que je dois utiliser un multiple en augmentant en conséquence la valeur de count ?

EDIT : Ok, j'avais mal lu le man, skip s'exprime en bloc et non en byte, il suffit donc de faire cela dans le dd de la boucle for skip=$(( x-1 )).

Et on m'a prévenu que ce n'était pas terrible d'utiliser seq de cette façon, qu'il vallait mieux utiliser la forme for((e1;e2;e3))