Mon shell est bash. J'ai 999 fichiers binaires nommés xx001 à xx999. Les 1,
2 ou 3 premiers octets de chacun de ces fichiers codent un nombre également
compris entre 1 et 999. (Un octet pour chaque chiffre, 30 pour 0, 31 pour 1,
etc.) Voici un échantillon :
$ for i in xx*; do head -c3 $i; ls $i; done
81 xx007
82 xx008
83 xx009
4 0xx010
84 xx011
243xx012
1 0xx013
Comment faire pour remplacer ces seuls premiers octets (toujours suivis d'un
espace puis d'un zéro) par les chiffres significatifs des noms de fichiers,
de telle façon que la même commande donne ceci :
Le 22/03/2010 19:29, *Hugues* a écrit fort à propos :
man dd
;)
J'aurais du y penser ! Merci.
Toutefois je ne vois pas comment retenir seulement les chiffres significatifs de mes noms de fichiers (sans les zéros qui précèdent)
en shell : $(( $TONNOMBRE )) , ou $[ $TONNOMBRE ] pour évaluer une expression mathématique.
ni comment remplacer seulement les octets précédant le premier espace sans écraser celui-ci ni le multiplier. D'autres pages de man ?
là c'est un man finger-ass-plop qu'il te faut !! :) pour conserver l'espace, j'ai pas trop compris ton problème à la base mais voilà deux pistes :
cut -d' ' -f1 (ou 2) selon le champ à récupérer à droite/gauche de l'espace,
ou sinon wc -c pour compter le nombre de caractères du champ en question.
dd en sortie vers stdout pour extraire la ligne, tu bricoles avec tous les indices donnés ici, et tu construis le résultat à donner à dd en écriture..
avant tout, fais un backup de tes fichiers lors de la finalisation de ton script...
-- Hugues Hiegel [http://www.hiegel.fr/~hugues/]
geo cherchetout
Le 22/03/2010 22:08, *Benoit Izac* a écrit fort à propos :
Non testé :
for f in xx*; do n=$(printf '%d' "${f#xx}") sed -e "1s/^[0-9][0-9]* /$n /" <"$f" >"$f.tmp" #mv "$f.tmp" "$f" done
C'est presque bon, il y a juste un problème de base de numération :
$ for f in xx*; do n=$(printf '%d' "${f#xx}"); sed -e "1s/^[0-9][0-9]* /$n /" <"$f" >"$f.tmp"; done bash: printf: 008: invalid octal number bash: printf: 009: invalid octal number bash: printf: 018: invalid octal number bash: printf: 019: invalid octal number bash: printf: 028: invalid octal number bash: printf: 029: invalid octal number etc
$ for i in xx*tmp; do head -c 3 $i; ls $i; done 1 0xx001.tmp 2 0xx002.tmp 3 0xx003.tmp 4 0xx004.tmp 5 0xx005.tmp 6 0xx006.tmp 7 0xx007.tmp 0 0xx008.tmp 0 0xx009.tmp 8 0xx010.tmp 9 0xx011.tmp 10 xx012.tmp 11 xx013.tmp 12 xx014.tmp 13 xx015.tmp 14 xx016.tmp 15 xx017.tmp 0 0xx018.tmp 0 0xx019.tmp 16 xx020.tmp etc
Le 22/03/2010 22:08, *Benoit Izac* a écrit fort à propos :
Non testé :
for f in xx*; do
n=$(printf '%d' "${f#xx}")
sed -e "1s/^[0-9][0-9]* /$n /" <"$f" >"$f.tmp"
#mv "$f.tmp" "$f"
done
C'est presque bon, il y a juste un problème de base de numération :
$ for f in xx*; do n=$(printf '%d' "${f#xx}"); sed -e "1s/^[0-9][0-9]* /$n
/" <"$f" >"$f.tmp"; done
bash: printf: 008: invalid octal number
bash: printf: 009: invalid octal number
bash: printf: 018: invalid octal number
bash: printf: 019: invalid octal number
bash: printf: 028: invalid octal number
bash: printf: 029: invalid octal number
etc
$ for i in xx*tmp; do head -c 3 $i; ls $i; done
1 0xx001.tmp
2 0xx002.tmp
3 0xx003.tmp
4 0xx004.tmp
5 0xx005.tmp
6 0xx006.tmp
7 0xx007.tmp
0 0xx008.tmp
0 0xx009.tmp
8 0xx010.tmp
9 0xx011.tmp
10 xx012.tmp
11 xx013.tmp
12 xx014.tmp
13 xx015.tmp
14 xx016.tmp
15 xx017.tmp
0 0xx018.tmp
0 0xx019.tmp
16 xx020.tmp
etc
Le 22/03/2010 22:08, *Benoit Izac* a écrit fort à propos :
Non testé :
for f in xx*; do n=$(printf '%d' "${f#xx}") sed -e "1s/^[0-9][0-9]* /$n /" <"$f" >"$f.tmp" #mv "$f.tmp" "$f" done
C'est presque bon, il y a juste un problème de base de numération :
$ for f in xx*; do n=$(printf '%d' "${f#xx}"); sed -e "1s/^[0-9][0-9]* /$n /" <"$f" >"$f.tmp"; done bash: printf: 008: invalid octal number bash: printf: 009: invalid octal number bash: printf: 018: invalid octal number bash: printf: 019: invalid octal number bash: printf: 028: invalid octal number bash: printf: 029: invalid octal number etc
$ for i in xx*tmp; do head -c 3 $i; ls $i; done 1 0xx001.tmp 2 0xx002.tmp 3 0xx003.tmp 4 0xx004.tmp 5 0xx005.tmp 6 0xx006.tmp 7 0xx007.tmp 0 0xx008.tmp 0 0xx009.tmp 8 0xx010.tmp 9 0xx011.tmp 10 xx012.tmp 11 xx013.tmp 12 xx014.tmp 13 xx015.tmp 14 xx016.tmp 15 xx017.tmp 0 0xx018.tmp 0 0xx019.tmp 16 xx020.tmp etc
Benoit Izac
Bonjour,
le 23/03/2010 à 00:21, geo cherchetout a écrit dans le message <4ba7fb3f$0$15856$ :
for f in xx*; do n=$(printf '%d' "${f#xx}") sed -e "1s/^[0-9][0-9]* /$n /" <"$f" >"$f.tmp" #mv "$f.tmp" "$f" done
C'est presque bon, il y a juste un problème de base de numération :
$ for f in xx*; do n=$(printf '%d' "${f#xx}"); sed -e "1s/^[0-9][0-9]* /$n /" <"$f" >"$f.tmp"; done bash: printf: 008: invalid octal number
remplace n=$(printf '%d' "${f#xx}") par n=$(("${f#xx}"))
-- Benoit Izac
Bonjour,
le 23/03/2010 à 00:21, geo cherchetout a écrit dans le message
<4ba7fb3f$0$15856$ba4acef3@reader.news.orange.fr> :
for f in xx*; do
n=$(printf '%d' "${f#xx}")
sed -e "1s/^[0-9][0-9]* /$n /" <"$f" >"$f.tmp"
#mv "$f.tmp" "$f"
done
C'est presque bon, il y a juste un problème de base de numération :
$ for f in xx*; do n=$(printf '%d' "${f#xx}"); sed -e "1s/^[0-9][0-9]*
/$n /" <"$f" >"$f.tmp"; done
bash: printf: 008: invalid octal number
remplace n=$(printf '%d' "${f#xx}")
par n=$(("${f#xx}"))