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

script bash

28 réponses
Avatar
Didier
Bonjour Í  tou(te)s,

Pourquoi la ligne de commande
« shred --remove --verbose --zero !(*.gpg) »
fait bien ce qu'elle doit,
mais que ça coince quand elle se trouve dans
un script bash ? y a-t-il une parade ?
Le message d'erreur : «
erreur de syntaxe près du symbole inattendu « ( »
/home/didier/bin/gpgc: ligne 9: ` shred --remove --verbose --zero
!(*.gpg)'

»

Librement,
Didier.

--
ma céramique : http://didierdescamps.fr
autres bouts de vie : http://didierdescamps.free.fr
--

10 réponses

1 2 3
Avatar
Nicolas George
Didier , dans le message <60be2414$0$3698$, a
écrit :
Pourquoi la ligne de commande
« shred --remove --verbose --zero !(*.gpg) »
fait bien ce qu'elle doit,
mais que ça coince quand elle se trouve dans
un script bash ?

Probablement parce que le bash interactif active l'option nécessaire.
Avatar
Didier
Le 07/06/2021 Í  15:50, Didier a écrit :
en fouillant un peu, j'arrive Í  mes fins en remplaçant la
ligne unique par ces 5 lÍ  :
for a in *; do
if [ "${a: -3}" != "gpg" ] ; then
shred --remove --verbose --zero $a
fi
done
mais il doit y avoir moyen de faire plus simple ?
--
ma céramique : http://didierdescamps.fr
autres bouts de vie : http://didierdescamps.free.fr
--
Avatar
Benoit Izac
Bonjour,
Le 07/06/2021 Í  20:18, Didier a écrit dans le message
<60be62db$0$3694$ :
en fouillant un peu, j'arrive Í  mes fins en remplaçant la
ligne unique par ces 5 lÍ  :
for a in *; do
if [ "${a: -3}" != "gpg" ] ; then
shred --remove --verbose --zero $a
fi
done
mais il doit y avoir moyen de faire plus simple ?

shopt -s extglob
--
Benoit Izac
Avatar
Francois Lafont
Hello,
Perso, pour ces trucs lÍ , j'aime bien utiliser find et éviter le plus possible des
« siouxeries » de la syntaxe bash :
find /mon/repertoire/ -maxdepth 1 -mindepth 1 -type f '!' -name '*.gpg' -exec shred --remove --verbose --zero '{}' ';'
La petite différence ici est que 1) ça ne prendra pas les répertoires et 2) les
fichiers dont le nom commence par un point seront pris en compte.
Ceci dit, la petite boucle for de Didier me semble pas mal, plutÍ´t explicite ce qui
est une bonne idée surtout quand c'est fait pour effacer des données.
--
François Lafont
Avatar
Didier
Le 08/06/2021 Í  10:09, Francois Lafont a écrit :
find /mon/repertoire/ -maxdepth 1 -mindepth 1 -type f '!' -name '*.gpg'
-exec shred --remove --verbose --zero '{}' ';'

Ça fait le job, et c'est beau !
Mais comme je suis (éternellement) débutant dans ce sport et que j'ai
une autre exigence dont je n'ai pas parlé, je suis arrivé Í  ça.
Le critère répertoire serait-il incorporable dans find ?
#!/bin/bash
# supprime tout ce qui n'est pas un fichier chiffré (.gpg)
# sans explorer les sous répertoires.
# Mais uniquement dans ~/.z , car trop dangereux ailleurs
# Didier Descamps, juin 2021.
ou=`pwd`
if [ "${ou:12:3}" = '/.z' ] ; then
for a in *; do
if [ "${a: -4}" != ".gpg" ] && [ -f $a ]; then
shred --remove --verbose --zero $a
fi
done
else
echo "Interdit dans ce répertoire !"
fi
Avatar
Olivier Miakinen
Bonjour,
Juste deux petites remarques.
Le 08/06/2021 20:06, Didier a écrit :
ou=`pwd`

La syntaxe avec `...` est désuète et souvent peu lisible (sauf bien sÍ»r dans
un cas aussi simple que `pwd`). Lui préférer la syntaxe $(...), plus lisible,
et qui peut s'imbriquer.
ou=$(pwd)
if [ "${ou:12:3}" = '/.z' ] ; then

Tu voulais tester uniquement ~/.z mais ton test répondra vrai pour un répertoire
nommé /etc/qqchose/.zilch/very_important/do_not_remove. Utiliser "${ou:12}"
serait moins dangereux, ou "${ou: -3}" si ça doit s'adapter Í  plusieurs home
de longueur différente et que seul le /.z final compte.
Mais ceci est sans doute encore plus lisible pour remplacer les deux lignes :
if [ "$(basename $(pwd))}" = '.z' ] ; then
--
Olivier Miakinen
Avatar
Olivier Miakinen
[Supersedes Í  cause d'une accolade laissée par erreur]
Bonjour,
Juste deux petites remarques.
Le 08/06/2021 20:06, Didier a écrit :
ou=`pwd`

La syntaxe avec `...` est désuète et souvent peu lisible (sauf bien sÍ»r dans
un cas aussi simple que `pwd`). Lui préférer la syntaxe $(...), plus lisible,
et qui peut s'imbriquer.
ou=$(pwd)
if [ "${ou:12:3}" = '/.z' ] ; then

Tu voulais tester uniquement ~/.z mais ton test répondra vrai pour un répertoire
nommé /etc/qqchose/.zilch/very_important/do_not_remove. Utiliser "${ou:12}"
serait moins dangereux, ou "${ou: -3}" si ça doit s'adapter Í  plusieurs home
de longueur différente et que seul le /.z final compte.
Mais ceci est sans doute encore plus lisible pour remplacer les deux lignes :
if [ "$(basename $(pwd))" = '.z' ] ; then
--
Olivier Miakinen
Avatar
Benoit Izac
Bonjour,
Le 08/06/2021 Í  21:14, Olivier Miakinen a écrit dans le message
<s9ofi6$1gr8$ :
ou=`pwd`

La syntaxe avec `...` est désuète et souvent peu lisible (sauf bien sÍ»r dans
un cas aussi simple que `pwd`). Lui préférer la syntaxe $(...), plus lisible,
et qui peut s'imbriquer.

^^^^^^^^^^^^^^^^^^^^^^^
«Â `…` » s'imbrique aussi, c'est juste qu'il faut les échapper.
«Â $(…) » a aussi ses petits problèmes :
% echo `(uname -s)`
Linux
% echo $((uname -s))
0
--
Benoit Izac
Avatar
Didier
Le 08/06/2021 Í  21:22, Olivier Miakinen a écrit :
ou=$(pwd)

Right!
if [ "${ou:12:3}" = '/.z' ] ; then

Tu voulais tester uniquement ~/.z mais ton test répondra vrai pour un répertoire
nommé /etc/qqchose/.zilch/very_important/do_not_remove. Utiliser "${ou:12}"
serait moins dangereux, ou "${ou: -3}" si ça doit s'adapter Í  plusieurs home
de longueur différente et que seul le /.z final compte.
Mais ceci est sans doute encore plus lisible pour remplacer les deux lignes :
if [ "$(basename $(pwd))" = '.z' ] ; then

Mais je veux que ça fonctionne aussi dans les sous-répertoires du
consacré secret
~/.z , or pwd retourne /.z et non /.z/ et je ne peux donc pas tester un
16eme caractère.À moins de tester aussi la longueur ? ça risque de se
compliquer alors.
Avatar
pehache
Le 08/06/2021 Í  21:47, Benoit Izac a écrit :
Bonjour,
Le 08/06/2021 Í  21:14, Olivier Miakinen a écrit dans le message
<s9ofi6$1gr8$ :
ou=`pwd`

La syntaxe avec `...` est désuète et souvent peu lisible (sauf bien sÍ»r dans
un cas aussi simple que `pwd`). Lui préférer la syntaxe $(...), plus lisible,
et qui peut s'imbriquer.

^^^^^^^^^^^^^^^^^^^^^^^
«Â `…` » s'imbrique aussi, c'est juste qu'il faut les échapper.

Et ça peut rapidement devenir totalement illisible, y compris pour celui
qui essaie de l'écrire.
«Â $(…) » a aussi ses petits problèmes :
% echo `(uname -s)`
Linux
% echo $((uname -s))
0

Tu te fais éventuellement avoir une ou deux fois avec ça, et après tu
retiens. L'illisibilité des backquote imbriquées par contre elle reste.
--
"...sois ouvert aux idées des autres pour peu qu'elles aillent dans le
même sens que les tiennes.", ST sur fr.bio.medecine
1 2 3