Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Deux petites questions (reponses attendues: non et non)

10 réponses
Avatar
Daniel Déchelotte
Bonjour,

C'est avec beaucoup d'optimisme que je vous soumets ces deux petites
questions :

1) Avec sed, peut-on travailler "en place" sur un fichier ?
Pour eviter le fatal :
sed 'blabla' < fichier > fichier
je dois faire :
mv -i fichier fichier.tmp
sed 'blabla' < fichier.tmp > fichier
rm fichier.tmp
ce qui est long. Reloud, comme disent les jeunes.

2) Avec tar, peut-on lui demander de completement ignorer le chemin (pas
juste l'eventuel "/" initial) de sorte a avoir une organisation plate des
fichiers ? Pour simplement rassembler plusieurs fichiers eparpilles dans
plusieurs repertoires, j'ai du aller dans chacun d'entre eux et appeler
"tar --append /chemin/de/mon/archive.tar mes fichiers" avant de faire le
gzip. A nouveau, long et reloud.

Quelqu'un a une bonne nouvelle ?

Daniel
--
http://yo.dan.free.fr/

10 réponses

Avatar
Antoine Bellot
Daniel Déchelotte a écrit:
Bonjour,

C'est avec beaucoup d'optimisme que je vous soumets ces deux petites
questions :

1) Avec sed, peut-on travailler "en place" sur un fichier ?
ce qui est long. Reloud, comme disent les jeunes.


Outre la (meilleure) réponse précédente de C.Guibourg, et pour
l'anecdote on peut éventuellement aussi faire "à l'ancienne" avec un
ed(1) script (on peut éventuellement noter que diff(1) -e peut produire
un script ed valide)

$ ed /tmp/toto <<END
s/^.*$/I messed my file/
END


<rant> D'ailleurs, on faisait comme ça avant que Larry Wall invente
patch(1) et d'autres ne l'améliorent, mais bon : c'est quand même mieux,
diff/patch, ceci expliquant l'existence de l'option -e </rant>

2) Avec tar, peut-on lui demander de completement ignorer le chemin (pas
juste l'eventuel "/" initial) de sorte a avoir une organisation plate des
fichiers ?


ça me semble difficile, car je ne vois pas comment tar pourrait gérer
d'éventuelles collisions de noms de fichiers (1/2/toto et 1/3/toto)

Pour contourner ça (avec GNU-tar, non testé avec d'autres tar), tu peux
éventuellement utiliser l'option --files-from (-T, --files-from) et
construire ta liste préalablement avec un "find / -type f ... -print"
adapté.

exemple :

find /tmp -type f -print | tar -cT - >toto.tar



--
Antoine Bellot
Hell, their contractor could even have removed the
source code from their systems already ("mmm, the
disk is full, lets remove some old projects").

Avatar
Antoine Bellot
Cyril Guibourg a écrit:

sed-inplace c'est un truc pour feignasses, ed rocks à donf.


Allez : un pti pour la route, pour les jeunots qui ne connaissent pas
(encore) :

----------------------------------------------------------------------
http://www.geocities.com/kensanata/ed.html
----------------------------------------------------------------------
From: (Patrick J. LoPresti)
Message-ID:
Subject: The True Path (long)
Date: 11 Jul 91 03:17:31 GMT
Newsgroups: alt.religion.emacs,alt.slack
Organization: Massachusetts Institute of Technology

When I log into my Xenix system with my 110 baud teletype, both vi
*and* Emacs are just too damn slow. They print useless messages like,
'C-h for help' and '"foo" File is read only'. So I use the editor
that doesn't waste my VALUABLE time......
----------------------------------------------------------------------

--
Antoine Bellot

Avatar
Stephane CHAZELAS
Le 03 Oct 2003 06:26:22 +0200, Cyril Guibourg écrivait :
[...]
-i extension
[...]

Ca doit pouvoir s'intégrer facilement dans une GNUterie.
[...]


C'est déjà au moins dans le GNU sed 4.0.

--
Stéphane

Avatar
Stephane CHAZELAS
Le Thu, 2 Oct 2003 23:06:20 -0400, Daniel Déchelotte écrivait :
[...]
1) Avec sed, peut-on travailler "en place" sur un fichier ?
Pour eviter le fatal :
sed 'blabla' < fichier > fichier
je dois faire :
mv -i fichier fichier.tmp
sed 'blabla' < fichier.tmp > fichier
rm fichier.tmp
ce qui est long. Reloud, comme disent les jeunes.


Long mais safe (enfin, si on rajoute un peu d'error-checking
entre les lignes).

avec ssed/GNU sed (et apparemment les sed des derniers *BSD)
sed -i~ 's/foo/bar/g' fichier.txt && rm -f fichier.txt~

Avec le ssed et le GNU sed (ssed et GNU sed ont mergé
récemment), on peut meme editer plusieurs fichiers:

sed -si~ 's/foo/bar/g' f1.txt f2.txt && rm f[12].txt~

Sinon, tu as toujours perl:

perl -pi~ -e 's/foo/bar/g' f[12].txt && rm f[12].txt~

Dans tous les cas, éviter de mettre une extension vide après
"-i", on peut alors perdre des données (le fichier est effacé
avant d'etre traité). On peut d'ailleurs faire l'équivalent
avec un sed traditionnel:

{ rm f.txt && sed 's/foo/bar/g' > f.txt;} < f.txt

Comme dit, on peut utiliser ex ou ed. Éviter ce dernier
toutefois dans des scripts, plein de problèmes avec ed:
portabilité, rapports d'erreur inexploitables, on peut perdre
des données, ça charge tout le fichier en mémoire (ou au moins
un certain nombre d'octets par ligne), limitation sur la taille
du fichier à éditer ou la taille des lignes suivant les versions
de ed...

--
Stéphane

Avatar
Stephane CHAZELAS
Le Thu, 2 Oct 2003 23:06:20 -0400, Daniel Déchelotte écrivait :
[...]
2) Avec tar, peut-on lui demander de completement ignorer le chemin (pas
juste l'eventuel "/" initial) de sorte a avoir une organisation plate des
fichiers ? Pour simplement rassembler plusieurs fichiers eparpilles dans
plusieurs repertoires, j'ai du aller dans chacun d'entre eux et appeler
"tar --append /chemin/de/mon/archive.tar mes fichiers" avant de faire le
gzip. A nouveau, long et reloud.


Tu peux créer des liens symboliques et utiliser l'option h de
tar.

Exemple (syntaxe zsh) :

mkdir /tmp/to-archive
ln -s /dir/to/archive/**/*(^/@) .
tar hcvf - . | gzip > ../archive.tar.gz

(attention que des fichiers n'aient pas le meme nom, voir
l'option -b/--backup du GNU ln alors.

Sinon, utilise pax, c'est la seule commande d'archivage qui est
standardisée par POSIX (au contraire de tar et cpio) (pax peut
créer des fichiers tar)

(syntaxe zsh)

pax -w -s ':.*/::' -x ustar /dir/to/archive/**/*(^/*)
| gzip > archive.tar.gz


(pour info **/*(^/@) veut dire la liste des fichiers (en
descendant dans les sous-répertoires) qui ne sont ni des
répertoires, ni des liens symboliques).

--
Stéphane

Avatar
Stephane CHAZELAS
Le Thu, 2 Oct 2003 23:06:20 -0400, Daniel Déchelotte écrivait :
[...]
2) Avec tar, peut-on lui demander de completement ignorer le chemin (pas
juste l'eventuel "/" initial) de sorte a avoir une organisation plate des
fichiers ? Pour simplement rassembler plusieurs fichiers eparpilles dans
plusieurs repertoires, j'ai du aller dans chacun d'entre eux et appeler
"tar --append /chemin/de/mon/archive.tar mes fichiers" avant de faire le
gzip. A nouveau, long et reloud.


Tu peux créer des liens symboliques et utiliser l'option h de
tar.

Exemple (syntaxe zsh) :

mkdir /tmp/to-archive
ln -s /dir/to/archive/**/*(^/@) .
tar hcvf - . | gzip > ../archive.tar.gz

(attention que des fichiers n'aient pas le meme nom, voir
l'option -b/--backup du GNU ln alors.

Sinon, utilise pax, c'est la seule commande d'archivage qui est
standardisée par POSIX (au contraire de tar et cpio) (pax peut
créer des fichiers tar)

(syntaxe zsh)

pax -w -s ':.*/::' -x ustar /dir/to/archive/**/*(^/*)
| gzip > archive.tar.gz


(pour info **/*(^/@) veut dire la liste des fichiers (en
descendant dans les sous-répertoires) qui ne sont ni des
répertoires, ni des liens symboliques).

--
Stéphane

Avatar
Stephane CHAZELAS
Le Thu, 2 Oct 2003 23:06:20 -0400, Daniel Déchelotte écrivait :
[...]
2) Avec tar, peut-on lui demander de completement ignorer le chemin (pas
juste l'eventuel "/" initial) de sorte a avoir une organisation plate des
fichiers ? Pour simplement rassembler plusieurs fichiers eparpilles dans
plusieurs repertoires, j'ai du aller dans chacun d'entre eux et appeler
"tar --append /chemin/de/mon/archive.tar mes fichiers" avant de faire le
gzip. A nouveau, long et reloud.


Tu peux créer des liens symboliques et utiliser l'option h de
tar.

Exemple (syntaxe zsh) :

mkdir /tmp/to-archive
ln -s /dir/to/archive/**/*(^/@) .
tar hcvf - . | gzip > ../archive.tar.gz

(attention que des fichiers n'aient pas le meme nom, voir
l'option -b/--backup du GNU ln alors.

Sinon, utilise pax, c'est la seule commande d'archivage qui est
standardisée par POSIX (au contraire de tar et cpio) (pax peut
créer des fichiers tar)

(syntaxe zsh)

pax -w -s ':.*/::' -x ustar /dir/to/archive/**/*(^/*)
| gzip > archive.tar.gz


(pour info **/*(^/@) veut dire la liste des fichiers (en
descendant dans les sous-répertoires) qui ne sont ni des
répertoires, ni des liens symboliques).

--
Stéphane

Avatar
Stephane CHAZELAS
Le Thu, 2 Oct 2003 23:06:20 -0400, Daniel Déchelotte écrivait :
[...]
2) Avec tar, peut-on lui demander de completement ignorer le chemin (pas
juste l'eventuel "/" initial) de sorte a avoir une organisation plate des
fichiers ? Pour simplement rassembler plusieurs fichiers eparpilles dans
plusieurs repertoires, j'ai du aller dans chacun d'entre eux et appeler
"tar --append /chemin/de/mon/archive.tar mes fichiers" avant de faire le
gzip. A nouveau, long et reloud.


Tu peux créer des liens symboliques et utiliser l'option h de
tar.

Exemple (syntaxe zsh) :

mkdir /tmp/to-archive
ln -s /dir/to/archive/**/*(^/@) .
tar hcvf - . | gzip > ../archive.tar.gz

(attention que des fichiers n'aient pas le meme nom, voir
l'option -b/--backup du GNU ln alors.

Sinon, utilise pax, c'est la seule commande d'archivage qui est
standardisée par POSIX (au contraire de tar et cpio) (pax peut
créer des fichiers tar)

(syntaxe zsh)

pax -w -s ':.*/::' -x ustar /dir/to/archive/**/*(^/*)
| gzip > archive.tar.gz


(pour info **/*(^/@) veut dire la liste des fichiers (en
descendant dans les sous-répertoires) qui ne sont ni des
répertoires, ni des liens symboliques).

--
Stéphane

Avatar
Stephane CHAZELAS
Le Thu, 2 Oct 2003 23:06:20 -0400, Daniel Déchelotte écrivait :
[...]
2) Avec tar, peut-on lui demander de completement ignorer le chemin (pas
juste l'eventuel "/" initial) de sorte a avoir une organisation plate des
fichiers ? Pour simplement rassembler plusieurs fichiers eparpilles dans
plusieurs repertoires, j'ai du aller dans chacun d'entre eux et appeler
"tar --append /chemin/de/mon/archive.tar mes fichiers" avant de faire le
gzip. A nouveau, long et reloud.


Tu peux créer des liens symboliques et utiliser l'option h de
tar.

Exemple (syntaxe zsh) :

mkdir /tmp/to-archive
ln -s /dir/to/archive/**/*(^/@) .
tar hcvf - . | gzip > ../archive.tar.gz

(attention que des fichiers n'aient pas le meme nom, voir
l'option -b/--backup du GNU ln alors.

Sinon, utilise pax, c'est la seule commande d'archivage qui est
standardisée par POSIX (au contraire de tar et cpio) (pax peut
créer des fichiers tar)

(syntaxe zsh)

pax -w -s ':.*/::' -x ustar /dir/to/archive/**/*(^/*)
| gzip > archive.tar.gz


(pour info **/*(^/@) veut dire la liste des fichiers (en
descendant dans les sous-répertoires) qui ne sont ni des
répertoires, ni des liens symboliques).

--
Stéphane

Avatar
Stephane CHAZELAS
Le Thu, 2 Oct 2003 23:06:20 -0400, Daniel Déchelotte écrivait :
[...]
2) Avec tar, peut-on lui demander de completement ignorer le chemin (pas
juste l'eventuel "/" initial) de sorte a avoir une organisation plate des
fichiers ? Pour simplement rassembler plusieurs fichiers eparpilles dans
plusieurs repertoires, j'ai du aller dans chacun d'entre eux et appeler
"tar --append /chemin/de/mon/archive.tar mes fichiers" avant de faire le
gzip. A nouveau, long et reloud.


Tu peux créer des liens symboliques et utiliser l'option h de
tar.

Exemple (syntaxe zsh) :

mkdir /tmp/to-archive
ln -s /dir/to/archive/**/*(^/@) .
tar hcvf - . | gzip > ../archive.tar.gz

(attention que des fichiers n'aient pas le meme nom, voir
l'option -b/--backup du GNU ln alors.

Sinon, utilise pax, c'est la seule commande d'archivage qui est
standardisée par POSIX (au contraire de tar et cpio) (pax peut
créer des fichiers tar)

(syntaxe zsh)

pax -w -s ':.*/::' -x ustar /dir/to/archive/**/*(^/*)
| gzip > archive.tar.gz


(pour info **/*(^/@) veut dire la liste des fichiers (en
descendant dans les sous-répertoires) qui ne sont ni des
répertoires, ni des liens symboliques).

--
Stéphane