#1 Le 09/06/2022, à 17:06
- ljere
[Résolu] est il possible de modifier un script en cours avec sed
bonjour,
j'utilise un script avec rsync pour récupérer mes fichiers sur mon serveur distant, mais ensuite je dois copier les derniers fichiers récupérer dans un dossier avant classement.
voilà le premier script qui fonctionne parfaitement
ajout.sh
#! /bin/bash
main()
{
ssh -T user@192.168.1.39 << 'EOF'
rsync -avh --progress -e "ssh -p port" user@XXX.XXX.XX.XX:~/torrent /mnt/srv
ls -p -R -t /mnt/srv410/torrent | head -n4 | tail -n+3 > /mnt/srv410/torrent/liste.txt
while read line
do
cp -r /mnt/srv/file/"${line}" /mnt//Nouveau
done < /mnt/srv/file/liste.txt
EOF
}
main
le souci vient du head -n6 qui est une valeur que je dois modifier à chaque fois, j'ai donc pensé à faire un pre-script que je lance précédé d'une variable mais ça ne fonctionne pas
#!/bin/bash
nbr="${1}"
sed -i 's/head -n4/head -n"${nbr}"/g' ~/ajout.sh
la ligne de commande
./pre_ajout.sh 6 && ./ajout.sh
alors que si je fais
sed -i 's/head -n4/head -n6/g' ajout.sh; ./ajout.sh
ça fonctionne mais pas très pratique
Dernière modification par ljere (Le 10/06/2022, à 09:00)
ancien PC Toshiba satellite_c670d-11 / Linux Mint 21 Vanessa
Nouveau PC ASUS TUF GAMING A17 GPU RTX 4070 CPU AMD Ryzen 9 7940HS w/ Radeon 780M Graphics / Linux Mint 21.2 Victoria / Kernel: 6.4.8-1-liquorix / Desktop: Cinnamon
Hors ligne
#2 Le 09/06/2022, à 17:23
- nany
Re : [Résolu] est il possible de modifier un script en cours avec sed
Bonjour,
Pour pouvoir prendre en compte les variables, il faut utiliser sed avec des double-quotes.
#!/bin/bash
nbr="${1}"
sed -i "s/head -n4/head -n${nbr}/g" ~/ajout.sh
Hors ligne
#3 Le 09/06/2022, à 17:34
- ljere
Re : [Résolu] est il possible de modifier un script en cours avec sed
merci ça fonctionne, mais malheureusement mon idée était mauvaise car une fois modifié le sed ne peut plus trouver la valeur changé, je tourne en rond lol
ancien PC Toshiba satellite_c670d-11 / Linux Mint 21 Vanessa
Nouveau PC ASUS TUF GAMING A17 GPU RTX 4070 CPU AMD Ryzen 9 7940HS w/ Radeon 780M Graphics / Linux Mint 21.2 Victoria / Kernel: 6.4.8-1-liquorix / Desktop: Cinnamon
Hors ligne
#4 Le 09/06/2022, à 17:38
- erresse
Re : [Résolu] est il possible de modifier un script en cours avec sed
Bonsoir,
Mais pourquoi vouloir modifier le script avant de le lancer, tu ne peux pas juste mettre ton paramètre "$1" directement dans le script ajout.sh ?
Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois le problème solutionné, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.
Hors ligne
#5 Le 09/06/2022, à 17:38
- nany
Re : [Résolu] est il possible de modifier un script en cours avec sed
C’est ce que je me suis dit.
Et pourquoi ne pas passer la valeur en argument directement dans ajout.sh ?
À noter aussi que ls dans un script, c’est à éviter.
Hors ligne
#6 Le 09/06/2022, à 17:40
- MicP
Re : [Résolu] est il possible de modifier un script en cours avec sed
Bonjour
Pour que le script ~/ajout.sh utilise la valeur 6 dans la commande head qui est dans le script,
la ligne de commande pour lancer le script pourrait être :
~/ajout.sh 6
et dans le script ~/ajout.sh on pourra récupérer la valeur donnée : 6
qui a été attribuée comme valeur au premier paramètre : $1
qui lui a été donné dans la ligne de commande :
#! /bin/bash
# Si aucun paramètre n'est donné au script alors afficher un message et quitter avec code d'erreur 1 sans exécuter la suite
[ ${#} = 0 ] && { echo "Donnez une valeur en paramètre à la commande $0"; exit 1; }
main()
{
ssh -T user@192.168.1.39 << 'EOF'
rsync -avh --progress -e "ssh -p port" user@XXX.XXX.XX.XX:~/torrent /mnt/srv
ls -p -R -t /mnt/srv410/torrent | head -n$1 | tail -n+3 > /mnt/srv410/torrent/liste.txt
while read line
do
cp -r /mnt/srv/file/"${line}" /mnt//Nouveau
done < /mnt/srv/file/liste.txt
EOF
}
main
Dernière modification par MicP (Le 09/06/2022, à 18:19)
Hors ligne
#7 Le 09/06/2022, à 17:45
- iznobe
Re : [Résolu] est il possible de modifier un script en cours avec sed
Bonjour ,
le souci vient du head -n6 qui est une valeur que je dois modifier à chaque fois
Peux tu etre plus precis quand a la modification de cette variable ?
pourquoi ne pas faire par exemple une boucle qui modifierait uniquement cette variable , du genre :
for i in (0 , 10 ) , i++ ; do
ls -p -R -t /mnt/srv410/torrent | head -n"($i)" | tail -n+3 > /mnt/srv410/torrent/liste.txt
done
en admettant que la variable dont tu as besoin va de 0 a 10 .
la syntaxe de la boucle est certainement fausse , j ' ai mis nimporte quoi , je me rapelle plus comment on fait une boucle incrementale en bash , mais comme je ne sais pas si c ' est ce dont tu as besoin je n ' ai pas cherché .
EDIT : Pour la syntaxe , ca serait a priori dans ce genre là pour un increment de pas de 2:
for i in {0..10..2}
do
echo "Welcome $i times"
done
Dernière modification par iznobe (Le 09/06/2022, à 17:50)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#8 Le 09/06/2022, à 18:25
- ljere
Re : [Résolu] est il possible de modifier un script en cours avec sed
erresse et nany non c'est bien par cela que j'avais initialement commencé mais ma variable n'était pas prise en compte, après je m'y suis peut être mal pris je viens de m'y remettre.
pour les autres messages je teste vos suggestions tout de suite merci d'avance.
MicP
voilà le retour que j'ai avec ta modification, c'est ce que j'avais moi même lors de mes premiers essais
head : l'option requiert un argument -- n
Saisissez « head --help » pour plus d'informations.
Dernière modification par ljere (Le 09/06/2022, à 18:39)
ancien PC Toshiba satellite_c670d-11 / Linux Mint 21 Vanessa
Nouveau PC ASUS TUF GAMING A17 GPU RTX 4070 CPU AMD Ryzen 9 7940HS w/ Radeon 780M Graphics / Linux Mint 21.2 Victoria / Kernel: 6.4.8-1-liquorix / Desktop: Cinnamon
Hors ligne
#9 Le 09/06/2022, à 18:28
- MicP
Re : [Résolu] est il possible de modifier un script en cours avec sed
Pour tester ma proposition de script,
lance ce script d'abord en lui donnant un paramètre
et ensuite, lance le même script mais cette fois sans lui donner de paramètre :
#!/bin/bash
[ ${#} = 0 ] && { echo "Donnez une valeur en paramètre à la commande $0"; exit 1; }
echo "La valeur donnée au premier paramètre est : $1"
echo "suite…"
Dernière modification par MicP (Le 09/06/2022, à 18:31)
Hors ligne
#10 Le 09/06/2022, à 18:38
- ljere
Re : [Résolu] est il possible de modifier un script en cours avec sed
MicP j'ai modifié ma réponse précédente
iznobe je modifie la variable selon le nombre de fichier que le rsync me récupère, par exemple si j'en ai 5 alors je met le head à 7, mon ls est trié par time il faut donc exlure sur les deux premières lignes le répertoire courant et le fichier liste.txt.
Dernière modification par ljere (Le 09/06/2022, à 18:40)
ancien PC Toshiba satellite_c670d-11 / Linux Mint 21 Vanessa
Nouveau PC ASUS TUF GAMING A17 GPU RTX 4070 CPU AMD Ryzen 9 7940HS w/ Radeon 780M Graphics / Linux Mint 21.2 Victoria / Kernel: 6.4.8-1-liquorix / Desktop: Cinnamon
Hors ligne
#11 Le 09/06/2022, à 21:03
- Watael
Re : [Résolu] est il possible de modifier un script en cours avec sed
une fonction main() n'a pas de sens en bash.
je plussoie l'idée de erresse, développée par MicP, sur l'emploi d'un argument passé au script.
par contre, je déconseille l'usage de ls, et d'un fichier temporaire.
par exemple, pour simplement afficher les noms des fichiers dans l'ordre croissants de leur date de dernière modification :
while IFS=' ' read -d '' date fileName; do echo "$fileName"; done < <(find "$srcDir/" -printf '%T@ %p\0' | sort -z -k1,1n)
mais je ne vois pas pourquoi tu t'em..
rsync récupère tant de fichiers vers une répertoire donné, puis tu veux copier ces fichiers dans un autre répertoire ?
c'est pas clair.
expose-nous clairement la situation de départ, et la situation souhaitée.
parce que là on essaie de réparer une usine à gaz, mais c'est toujours une plus grosse usine à gaz.
Dernière modification par Watael (Le 09/06/2022, à 21:06)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#12 Le 09/06/2022, à 21:13
- nany
Re : [Résolu] est il possible de modifier un script en cours avec sed
je modifie la variable selon le nombre de fichier que le rsync me récupère
S’il s’agit de la commande rsync du script, comment sais-tu le nombre à l’avance ?ajout.sh
#! /bin/bash main() { ssh -T user@192.168.1.39 << 'EOF' rsync -avh --progress -e "ssh -p port" user@XXX.XXX.XX.XX:~/torrent /mnt/srv ls -p -R -t /mnt/srv410/torrent | head -n4 | tail -n+3 > /mnt/srv410/torrent/liste.txt while read line do cp -r /mnt/srv/file/"${line}" /mnt//Nouveau done < /mnt/srv/file/liste.txt EOF } main
Il y a deux fichiers liste.txt. L’un dans /mnt/srv410/torrent et l’autre dans /mnt/srv/file.
Je ne comprends pas comment tu passes du premier au second.
Si je pose ces questions c’est parce que je pense qu’on peut remplacer la commande ls par une commande find qui ressemblerait à ça :
find /mnt/srv410/torrent -type f ! -name liste.txt -cmin -10 -exec…
[edit]
Ah ben Watael est intervenu.
Et oui, mon idée est de finir par supprimer les fichiers liste.txt.
Donc +1 sur ce que dit Watael.
[/edit]
Dernière modification par nany (Le 09/06/2022, à 21:19)
Hors ligne
#13 Le 09/06/2022, à 21:17
- Watael
Re : [Résolu] est il possible de modifier un script en cours avec sed
+1
mais, plutôt -mmin ?
rsync ne modifie pas les dates des fichiers, il me semble.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#14 Le 09/06/2022, à 21:27
- nany
Re : [Résolu] est il possible de modifier un script en cours avec sed
Alors va pour mmin. Je me suis d’ailleurs posé la question de savoir lequel utiliser.
Il semblerait que j’ai fait le mauvais choix.
Hors ligne
#15 Le 10/06/2022, à 08:59
- ljere
Re : [Résolu] est il possible de modifier un script en cours avec sed
je sais le nombre de fichier à l'avance puisqu'il s'agit du nombre de téléchargement (libre de droit) que j'ai fais,
le rsync fait une copie de mon serveur donc le dossier /mnt/srv410/torrent est forcément identique, mais c'est difficilement utilisable, donc je copie les fichier ailleurs, je les renomme si besoin et les classe dans différent dossiers, pour pouvoir ensuite les trouver et utiliser facilement.
voici le début du retour du ls
ls -p -R -t /media/jerem/srv410/torrent
/media/jerem/srv410/torrent:
liste.txt
ces deux lignes doivent donc être supprimées.
voilà donc script modifié, je ne vois pas de différence entre mmin ou cmin mais ça à l'air de fonctionner
#! /bin/bash
main()
{
ssh -T user@192.168.1.39 << 'EOF'
rsync -avh --progress -e "ssh -p port" user@ip:~/torrent /mnt/srv410
find /mnt/srv410/torrent -type f ! -name liste.txt -mmin -30 > /mnt/srv410/torrent/liste.txt
while read line
do
cp -riv "${line}" /mnt/..../Nouveau
done < /mnt/srv410/torrent/liste.txt
EOF
}
main
Je vous remercie pour votre aide (le pire c'est que j'avais commencé par find, mais je l'avais trouvé trop compliqué pour ce que je voulais faire)
Dernière modification par ljere (Le 10/06/2022, à 09:04)
ancien PC Toshiba satellite_c670d-11 / Linux Mint 21 Vanessa
Nouveau PC ASUS TUF GAMING A17 GPU RTX 4070 CPU AMD Ryzen 9 7940HS w/ Radeon 780M Graphics / Linux Mint 21.2 Victoria / Kernel: 6.4.8-1-liquorix / Desktop: Cinnamon
Hors ligne
#16 Le 10/06/2022, à 10:25
- nany
Re : [Résolu] est il possible de modifier un script en cours avec sed
Et voilà, il n’y a donc plus qu’un fichier liste.txt utilisé. On peut supprimer ce fichier et le script devient alors, en simplifiant :
#! /bin/bash
ssh -T user@192.168.1.39 << 'EOF'
rsync -avh --progress -e "ssh -p port" user@ip:~/torrent /mnt/srv410
find /mnt/srv410/torrent -type f ! -mmin -30 -exec cp -riv '{}' /mnt/..../Nouveau \;
EOF
Hors ligne
#17 Le 10/06/2022, à 12:43
- Watael
Re : [Résolu] est il possible de modifier un script en cours avec sed
-exec cp -riv -t /mnt/..../Nouveau/ '{}' +
ainsi, toute la liste est copiée en une fois.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#18 Le 11/06/2022, à 09:25
- ljere
Re : [Résolu] est il possible de modifier un script en cours avec sed
Bonjour,
alors j'ai essayé la commande de nany qui malheureusement ne fonctionne pas, voici le retour répété le nombre de fois qu'il y a de fichier dans le dossier
cp -riv /mnt/.../Nouveau
j'ai donc ajouté la modification proposée par Watael qui sur le coup je pensai qu'elle fonctionnait vu qu'il n'y avait pas de message d'erreur, en effet il était entrain de copier l'ensemble du dossier source
ancien PC Toshiba satellite_c670d-11 / Linux Mint 21 Vanessa
Nouveau PC ASUS TUF GAMING A17 GPU RTX 4070 CPU AMD Ryzen 9 7940HS w/ Radeon 780M Graphics / Linux Mint 21.2 Victoria / Kernel: 6.4.8-1-liquorix / Desktop: Cinnamon
Hors ligne
#19 Le 11/06/2022, à 09:48
- nany
Re : [Résolu] est il possible de modifier un script en cours avec sed
Oups ! J’ai oublié d’effacer le point d’exclamation avec -name ! Forcément ça fait du monde.
Alors, on reprend :
find /mnt/srv410/torrent -type f -mmin -30 -exec cp -riv -t /mnt/..../Nouveau/ '{}' +
Hors ligne
#20 Le 11/06/2022, à 10:06
- ljere
Re : [Résolu] est il possible de modifier un script en cours avec sed
merci cette fois ci ça fonctionne correctement j'ai juste du utiliser cmin, mmin ne trouvait rien.
ancien PC Toshiba satellite_c670d-11 / Linux Mint 21 Vanessa
Nouveau PC ASUS TUF GAMING A17 GPU RTX 4070 CPU AMD Ryzen 9 7940HS w/ Radeon 780M Graphics / Linux Mint 21.2 Victoria / Kernel: 6.4.8-1-liquorix / Desktop: Cinnamon
Hors ligne
#21 Le 11/06/2022, à 10:59
- Watael
Re : [Résolu] est il possible de modifier un script en cours avec sed
l'option -r (--recursive) de cp n'est pas utile.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#22 Le 11/06/2022, à 11:06
- ljere
Re : [Résolu] est il possible de modifier un script en cours avec sed
d'accord
ancien PC Toshiba satellite_c670d-11 / Linux Mint 21 Vanessa
Nouveau PC ASUS TUF GAMING A17 GPU RTX 4070 CPU AMD Ryzen 9 7940HS w/ Radeon 780M Graphics / Linux Mint 21.2 Victoria / Kernel: 6.4.8-1-liquorix / Desktop: Cinnamon
Hors ligne