Pages : 1
#1 Le 04/10/2021, à 20:14
- Jarodd
rm * dans un script bash
Bonjour,
Je m'initie au bash, avec pour sujet la sauvegarde de quelques fichiers sur mon poste.
Je coince sur un truc a priori simple... Je fais une sauvegarde (copie) d'un répertoire avec plusieurs fichiers, mais je voudrais exclure un type de fichier spécifique (ici les .apk).
J'ai tenté ceci depuis la ligne de commande :
rm "/path/to/dir/*.apk"
Et mes apk sont bien supprimés.
Or cela ne fonctionne pas dans mon script, la même commande ne retourne l'erreur :
rm: impossible de supprimer '/path/to/dir/*.apk': Aucun fichier ou dossier de ce type
Si je mets /path/to/dir/nomdufichier.apk, celui-ci est bien supprimé. C'est donc le joker "*" qui coince. Mais pourquoi ça passe dans le terminal, et pas dans le script ?
Merci pour votre aide.
Edit 05/10 : résolu avec cette syntaxe :
rm "$path/to/dir"/*.ext
Dernière modification par Jarodd (Le 05/10/2021, à 12:06)
Ubuntu 22.04.3 LTS (64 bits)
Hors ligne
#2 Le 04/10/2021, à 20:26
- Vobul
Re : rm * dans un script bash
C'est à cause des guillemets Ça protège du "wildcard expension".
Vobul
Utilisez le retour utilisable de commandes !!!
J'aime la langue française, mais je parle franglais, deal with it.
RTFM
Hors ligne
#3 Le 04/10/2021, à 20:27
- Watael
Re : rm * dans un script bash
salut,
ça ne devrait pas fonctionner dans le terminal, car le Développement des chemins (le remplacement de l'astérisque par la liste de noms des fichiers correspondants) n'a pas lieu entre guillemets.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#4 Le 04/10/2021, à 20:53
- Tawal
Re : rm * dans un script bash
Hello,
Pourquoi copier les .apk pour les supprimer ensuite ?
Edit:
Copier tous les fichiers depuis Source vers Dest sauf les .apk et les .APK:
find Source -type f ! -iname "*.apk" -exec cp -t Dest '{}' \+
Dernière modification par Tawal (Le 04/10/2021, à 21:02)
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#5 Le 04/10/2021, à 21:28
- Jarodd
Re : rm * dans un script bash
En effet dans le terminal ce n'est pas exactement la même commande, j'ai fait le test sans les guillemets.
Dans le script, j'ai une variable pour le chemin, j'ai oublié de le préciser car j'ai copié l'erreur dans mon message, et non la ligne du script.
Le code du script :
src_home="/home/monuser/src/"
dst_home="/home/monuser/dst/"
...
rm "$dst_home""fichiers/*.apk"
J'ai lu qu'il fallait entourer les variables de guillemets. Ensuite pour le reste du chemin, ça m'a semblé logique d'en mettre aussi. Mais cet enchaînement des guillemets n'est pas très beau
J'ai essayé de mettre *.apk en dehors des guillemets, pour éviter le wildcard expension, même si je ne sais pas bien ce que c'est
Mais j'ai la même erreur... Faut-il des guillemets simple ? À quel endroit exactement ? Si vous avez un lien qui explique ça facilement... J'ai lu des messages sur stackoverflow, mais c'est toujours spécifique à un problème précis.
Merci !
Ubuntu 22.04.3 LTS (64 bits)
Hors ligne
#6 Le 05/10/2021, à 07:08
- diesel
Re : rm * dans un script bash
Si vous avez un lien qui explique ça facilement... J'ai lu des messages sur stackoverflow, mais c'est toujours spécifique à un problème précis.
Merci !
man bash
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#7 Le 05/10/2021, à 08:09
- Tawal
Re : rm * dans un script bash
rm "$dst_home""fichiers/*.apk"
fichiers est le dossier dans lequel se trouvent les .apk à supprimer ?
De toute façon, ta commande rm n'est pas bonne.
Si les .apk sont directement dans le dossier $dst_home :
rm "$dst_home"/*.apk
Si ils sont dans le dossier $dst_home/fichiers :
rm "$dst_home/fichiers"/*.apk
Mais je répète : pourquoi copier les .apk pour les supprimer ensuite ?
Si tu es sur un SSD, tu l'uses vraiment inutilement.
PS:
wildcard = *
expansion = remplacer par tous les noms correspondants
Donc en enlevant les guillemets, tu n'évites pas le "wildcard expansion", au contraire tu permets qu'elle se fasse.
Et c'est ce que tu cherches.
Edit:
Je ne vois pas l'intérêt de faire une sauvegarde de fichiers sur le même disque et la même partition !
Si tu perds l'un ou l'autre, tu perds aussi la sauvegarde !
Dernière modification par Tawal (Le 05/10/2021, à 08:13)
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#8 Le 05/10/2021, à 08:36
- diesel
Re : rm * dans un script bash
Ce n'est peut-être qu'une version de mise au point du script.
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#9 Le 05/10/2021, à 12:05
- Jarodd
Re : rm * dans un script bash
C'est bien ça, merci pour votre aide !
rm "$path/to/dir"/*.ext
Ubuntu 22.04.3 LTS (64 bits)
Hors ligne
#10 Le 05/10/2021, à 12:59
- Tawal
Re : rm * dans un script bash
De rien, mais tu devrais considérer le fait de ne pas copier ces fameux fichiers .apk.
De plus, la commande find est très utile en bash, la comprendre et savoir l'utiliser pourrait te débloquer de certaines situations
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#11 Le 05/10/2021, à 13:21
- Jarodd
Re : rm * dans un script bash
Oui je vais regarder ça, mais j'avance pas à pas, et pour l'instant ça ne semble pas être de mon niveau. La copier sans la comprendre ne sert à rien.
Ubuntu 22.04.3 LTS (64 bits)
Hors ligne
#12 Le 05/10/2021, à 14:11
- Tawal
Re : rm * dans un script bash
La copier sans la comprendre ne sert à rien.
Tout à fait d'accord avec toi
Un man find te permettra de bien la comprendre.
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#13 Le 05/10/2021, à 16:16
- Vobul
Re : rm * dans un script bash
man rsync
pour les backups c'est bien pratique également.
Vobul
Utilisez le retour utilisable de commandes !!!
J'aime la langue française, mais je parle franglais, deal with it.
RTFM
Hors ligne
#14 Le 05/10/2021, à 17:14
- MicP
Re : rm * dans un script bash
Bonjour
Le shell va d'abord interpréter les lignes de commandes entrées avant de lancer l'exécution de la ligne de commande interprétée.
Donc, pour voir ce que le shell que tu utilises (sans doute /bin/bash) va transmettre comme arguments à ta commande,
mets une commande echo avant le nom de la commande à lancer.
Par exemple, dans une fenêtre de terminal,
lance la ligne de commandes suivante :
echo ls "$path/to/dir"/*.ext
Ça ne va pas lancer l'exécution de la commande ls
ça va juste afficher la même ligne de commande, mais, dans ce qui va s'afficher,
la variable $path sera remplacée par la valeur qui lui avait été assignée avant de lancer cette ligne de commandes,
et, s'il en existe, ce sera la liste de tous les fichiers existants dans le répertoire $path/to/dir/
dont le nom se termine par .ext qui s'affichera à la suite.
=======
Guide avancé d'écriture des scripts Bash
Guide avancé d'écriture des scripts Bash -> 5. Guillemets et apostrophes
Dernière modification par MicP (Le 05/10/2021, à 17:40)
Hors ligne