[bash] Remplacer file:/// et %20

Résolu/Fermé
Ssylvainsab Messages postés 2884 Date d'inscription samedi 29 juillet 2006 Statut Modérateur Dernière intervention 15 août 2020 - 17 juin 2008 à 14:21
Ssylvainsab Messages postés 2884 Date d'inscription samedi 29 juillet 2006 Statut Modérateur Dernière intervention 15 août 2020 - 17 juin 2008 à 18:12
Bonjour.

J'ai crée un petit script de sauvegarde très simple, qui me permet de créer rapidement une copie de sauvegarde datée d'un ou plusieurs fichiers ou dossiers :
~ $ mkdir /tmp/bakfile;cd /tmp/bakfile
/tmp/bakfile $ touch file
/tmp/bakfile $ mkdir dir
/tmp/bakfile $ cat /usr/local/bin/bakfile
#!/bin/bash
for file in $*; do
  cp -a "$file" "$file.$(date +%Y-%m-%d--%Hh%M).bak";
done
/tmp/bakfile $ bakfile file dir
/tmp/bakfile $ ll
total 8,0K
drwxr-xr-x 2 sylvain sylvain 4,0K 2008-06-17 14:15 dir
drwxr-xr-x 2 sylvain sylvain 4,0K 2008-06-17 14:15 dir.2008-06-17--14h15.bak
-rw-r--r-- 1 sylvain sylvain    0 2008-06-17 14:15 file
-rw-r--r-- 1 sylvain sylvain    0 2008-06-17 14:15 file.2008-06-17--14h15.bak


Mais cependant, ce script a un problème lorsque je tente de l'utiliser via le gestionnaire de fichiers (nautilus scripts ou actions personnalisées pour Thunar), à cause des fichiers qui sont nommés file:///chemin/vers/fichier%20texte.file et pas /chemin/vers/fichier texte.file (par exemple).
Je cherche donc un moyen de remplacer file:/// et %20 respectivement par rien et par un espace dans mon script.
J'ai essayé avec sed, mais je ne me débrouille pas bien, et je ne sais pas comment faire pour que l'argument passé à sed soit une chaîne de caractères et pas un fichier . Voici la ligne que j'ai ajoutée à mon script :
  file=$(sed -e 's/%20/ /g' $(sed -e 's-file\:///--g' $file));


Je cherche également un moyen de supprimer le slash à la fin du nom des dossiers, à cause de :
/tmp/bakfile $ cd ../
/tmp $ bakfile bakfile/
cp: ne peut copier un répertoire `bakfile/' dans lui-même `bakfile/.2008-06-17--14h20.bak'


Quelqu'un aurait-il une solution ? Merci.
--
Sylvain
A voir également:

12 réponses

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
17 juin 2008 à 14:36
Ssalut Ssylvain :-)
kilian@kilian-laptop:~$ file=file:///machinproutprout%20machin
kilian@kilian-laptop:~$ file=$(echo $file | sed -e 's/%20/ /g' | sed -e 's/file:\/\/\// /g')
kilian@kilian-laptop:~$ echo $file
machinproutprout machin

J'imagine que ya bien plus simple et élégant mais bon sed c'est pas ma spécialité :-)
1
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
17 juin 2008 à 14:43
Ah pas forcément avec sed? ben alors ya de multiples façons :-)
Comme:
kilian@kilian-laptop:~$ echo $file
file:///machinproutprout%20machin
kilian@kilian-laptop:~$ python -c "print '$file'.replace('file:///','').replace('%20', ' ')" 
machinproutprout machin
1
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
17 juin 2008 à 15:24
C'est le problème du "for file in...." qui sépare aussi les espaces comme les lignes. Chaque entité séparée par des espaces/lignes/tabulation est une nouvelle occurence.
Il faudrait que tu passes en argument tes fichiers avec des guillemets, en espérant que ça n'occasionne pas trop de changement dans ton script.
Pour le problème du slash à la fin:
kilian@kilian-laptop:~$ echo mach/in/ | sed -e 's/\/$//g'
mach/in

1
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
17 juin 2008 à 15:25
mettre le nom entre guillemets
bakfile "a\ a"
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ssylvainsab Messages postés 2884 Date d'inscription samedi 29 juillet 2006 Statut Modérateur Dernière intervention 15 août 2020 825
17 juin 2008 à 15:44
Le script fini pour ceux que ça intéresse. Il ne permet pas de sauvegarder des fichiers avec des espaces (ou tout autre caractère considéré comme un séparateur d'arguments) dans le nom. Mais bon, on sauvegarde surtout des fichiers de configuration, donc sans espaces.
#!/bin/bash
for file in $*; do
  file=$(echo "$file" | sed -e 's/%20/ /g' | sed -e 's-file://--g')
  file=${file%/}
  cp -va "$file" "$file.$(date +%Y-%m-%d--%Hh%M).bak"
done

--
Sylvain
1
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
17 juin 2008 à 16:17
Salut,

Tiens pour tes fichiers avec espaces, la nuance est subtile mais efficace, et puis la syntaxe pour "sed" sur une seule ligne...
[jp@MDK-2008 trash]$ cat foo.sh
#!/bin/bash

for file in "$@"; do
file=$(echo "$file" | sed -e 's|%20| |g;s|file://||g;s|/$||')
echo ${file}
done

[jp@MDK-2008 trash]$ ./foo.sh fichier "fich avec espace" rep/ 
fichier
fich avec espace
rep
[jp@MDK-2008 trash]$
;-))
1
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
17 juin 2008 à 16:22
On t'attendait.
;-)

Ta réponse m'émeut!
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895 > kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016
17 juin 2008 à 16:29
T'es z'ému ? Comme Vanessa ? ;-DDD
0
Ssylvainsab Messages postés 2884 Date d'inscription samedi 29 juillet 2006 Statut Modérateur Dernière intervention 15 août 2020 825
17 juin 2008 à 14:39
Merci !
Je teste ça tout de suite.

J'imagine que ya bien plus simple et élégant mais bon sed c'est pas ma spécialité :-)
Du moment que ça marche... :-)
Je ne cherche pas forcément quelque chose en avec sed par contre, juste quelque chose qui marche ;-)
--
Sylvain
0
Ssylvainsab Messages postés 2884 Date d'inscription samedi 29 juillet 2006 Statut Modérateur Dernière intervention 15 août 2020 825
17 juin 2008 à 15:02
Hm, enfin c'est plus simple à lire avec sed qu'avec python quand même ;-)

J'ai toujours un problème : depuis le gestionnaire de fichier, je ne peux pas utiliser la commande sur des fichiers dont le nom contient des espaces. Je crois que c'est parce la commande echo $file enlève les backslashs qui échappent les espaces. Comment faire pour ne pas les enlever (je vais essayer avec echo -e) ?
Et il y a toujours le problème du slash à la fin du nom des dossiers.
--
Sylvain
0
Ssylvainsab Messages postés 2884 Date d'inscription samedi 29 juillet 2006 Statut Modérateur Dernière intervention 15 août 2020 825
17 juin 2008 à 15:07
Hm, non, en fait ça vient de bash lui-même qui interprète blabla\ blabla comme deux arguments "blabla\" ($1) et "blabla" ($2) au lieu de "blabla blabla" :
/tmp/bakfile $ touch a\ a
/tmp/bakfile $ ll
total 0
-rw-r--r-- 1 sylvain sylvain 0 2008-06-17 15:06 a a
/tmp/bakfile $ bakfile a\ a
cp: ne peut évaluer `a': Aucun fichier ou répertoire de ce type
cp: ne peut évaluer `a': Aucun fichier ou répertoire de ce type

--
Sylvain
0
Ssylvainsab Messages postés 2884 Date d'inscription samedi 29 juillet 2006 Statut Modérateur Dernière intervention 15 août 2020 825
17 juin 2008 à 15:35
bakfile fichier avec des espaces
bakfile 'fichier avec des espaces'
bakfile "fichier avec des espaces"
bakfile fichier\ avec\ des\ espaces
bakfile 'fichier\ avec\ des\ espaces'
bakfile "fichier\ avec\ des\ espaces"

Aucun ne marche... dommage je crois que je vais devoir me contenter de sauvegarder des fichiers sans espaces.

Et sinon, aucune idée pour supprimer le slash à la fin des chemins des répertoires ?
--
Sylvain
0
Ssylvainsab Messages postés 2884 Date d'inscription samedi 29 juillet 2006 Statut Modérateur Dernière intervention 15 août 2020 825
17 juin 2008 à 15:39
Il suffisait que je cherche un peu : http://pagesperso-orange.fr/gleu/absfr.tuxfamily.org/abs-2.3-fr/textproc.html
n=${n%/}          #  Supprime le slash de fin

--
Sylvain
0
Ssylvainsab Messages postés 2884 Date d'inscription samedi 29 juillet 2006 Statut Modérateur Dernière intervention 15 août 2020 825
17 juin 2008 à 16:56
Merci !
Voilà la script avec lequel tout fonctionne :
#!/bin/bash
for file in "$@"; do
  file=$(echo "$file" |sed -e 's|%20| |g;s|file://||;s|/$||')
  cp -a "$file" "$file.$(date +%Y-%m-%d--%Hh%M).bak"
done


Je croyais pourtant que $* et $@ étaient la même chose... m'enfin.
--
Sylvain
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
17 juin 2008 à 17:44
Je croyais pourtant que $* et $@ étaient la même chose... m'enfin.
En fait oui et non.
Les 2 représentent effectivement l'ensemble des paramètres à la différence prêt que :
* représente l'ensemble des paramètres sous la forme d'un seul argument
@ représente l'ensemble des paramètres sous la forme d'un argument par parémètre
et il faut aussi tenir compte des quotes autour...

Exemple :
[jp@MDK-2008 trash]$ cat sylvain.sh 
#! /bin/bash

echo
echo 'Exemple avec $*'
echo "Affichage sans quotes double"
for argument in $*
do
echo "Paramètre : $argument"
done

echo
echo 'Exemple avec "$*"'
echo "Affichage avec quotes double"
for argument in "$*"
do
echo "Paramètre : $argument"
done

echo
echo 'Exemple avec $@'
echo "Affichage sans quotes double"
for argument in $@
do
echo "Paramètre : $argument"
done

echo
echo 'Exemple avec "$@"'
echo "Affichage avec quotes double"
for argument in "$@"
do
echo "Paramètre : $argument"
done
[jp@MDK-2008 trash]$ ./sylvain.sh sylvain kilian jipicy "comment ça marche"

Exemple avec $*
Affichage sans quotes double
Paramètre : sylvain
Paramètre : kilian
Paramètre : jipicy
Paramètre : comment
Paramètre : ça
Paramètre : marche

Exemple avec "$*"
Affichage avec quotes double
Paramètre : sylvain kilian jipicy comment ça marche

Exemple avec $@
Affichage sans quotes double
Paramètre : sylvain
Paramètre : kilian
Paramètre : jipicy
Paramètre : comment
Paramètre : ça
Paramètre : marche

Exemple avec "$@"
Affichage avec quotes double
Paramètre : sylvain
Paramètre : kilian
Paramètre : jipicy
Paramètre : comment ça marche
[jp@MDK-2008 trash]$ 
;-))
0
Ssylvainsab Messages postés 2884 Date d'inscription samedi 29 juillet 2006 Statut Modérateur Dernière intervention 15 août 2020 825 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
17 juin 2008 à 18:12
Ah, merci :-)
--
Sylvain
0