Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 wink Ç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.

En 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 tongue
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 big_smile
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

Jarodd a écrit :

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

Jarrod a écrit :
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 wink


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

Jarrod a écrit :

La copier sans la comprendre ne sert à rien.

Tout à fait d'accord avec toi wink
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