nom de fichier avec espaces en argument

nom de fichier avec espaces en argument - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 07-08-2005 à 12:44:21    

Bonjour.
J'essaye d'écrire un script, mais il bloque pour l'instant sur les fichier contenant des espace.
Un exemple, j'aimerais executer la commande suivante:
cd $A avec A=mon répertoire numérau un
Et bien ça ne marche pas! Le scripte me renvois line X... too many arguments
En temps normale dans une console on taperait cd mon\ répertoire\ numérau\ un
J'ai pensé alors utiliser sed pour insérer un "\" avant chaque espaces.
Ainsi, A contient textuellement mon\ répertoire\ numérau\ un
Mais rien n'y fait, j'ai toujours ce même message d'erreur.
J'ajoute que je ne veux surtout pas purger mes documents de leurs espace en les remplacant par des "_" ou autre chose.
 
Voilà.Merci pour toutes vos popositions.

Reply

Marsh Posté le 07-08-2005 à 12:44:21   

Reply

Marsh Posté le 07-08-2005 à 12:53:11    

peut etre en faisant A="mon répertoire numéro un" et en suite cd $A

Reply

Marsh Posté le 07-08-2005 à 12:58:44    

Oui c'est ça :
A="mon repertoire" puis cd "$A"

Reply

Marsh Posté le 07-08-2005 à 15:40:58    

D'accord merci beaucoup.
En fait mon A vient d'une boucle for.
C'est juste syntaxiquement for A in "*" ?
Je vais essayer de suite.

Reply

Marsh Posté le 07-08-2005 à 15:51:48    

affiche voir ton script

Reply

Marsh Posté le 07-08-2005 à 16:23:46    

Pour l'instant c'est juste un script pour tester la fonction, il ne sert pas à grand chose:
 
cd /home/titi/c
for i in *
do
cd $i
mkdir ok
cd /home/titi/c
done
 
je créé un répertoire "ok" pour vérifier qu'il a bien réussi à rentré dans le sous-répertoire du répertoire parent c

Reply

Marsh Posté le 07-08-2005 à 16:26:48    

J'aurais plutôt fait :

Code :
  1. cd /home/titi/c
  2. for i in `find ./ -type d -maxdepth 1`; do
  3. cd "$i"
  4. mkdir ok;
  5. cd /home/titi/c
  6. done


Message édité par jlighty le 07-08-2005 à 16:32:17
Reply

Marsh Posté le 07-08-2005 à 16:26:59    

cd /home/titi/c
for i in *
do
    if [ -d "$i" ]
    then
       cd "$i"
       mkdir ok
       cd /home/titi/c
    fi
done

Reply

Marsh Posté le 07-08-2005 à 16:29:49    

jlighty a écrit :

J'aurais plutôt fait :

Code :
  1. cd /home/titi/c
  2. for i in `find ./ -type d`
  3. cd $i
  4. mkdir ok;
  5. cd /home/titi/c
  6. done


Il n'a pas dit qu'il voulait appliquer le script sur tous les sous répertoires. Il faudrait utiliser -maxdepth 1 avec find (et utiliser des guillemets pour les espaces :o )


Message édité par Pillow le 07-08-2005 à 16:30:08
Reply

Marsh Posté le 07-08-2005 à 16:33:06    

c'est édité :jap:

Reply

Marsh Posté le 07-08-2005 à 16:33:06   

Reply

Marsh Posté le 07-08-2005 à 17:17:46    

Merci beaucoup pillow, ton script fonctionne!
Jllghty, dsl mais le tien n'arrive pas à rentrer dans les répertoires à espace.
Bon bin j'y retourne (jusqu'au prochain problème ;) )

Reply

Marsh Posté le 07-08-2005 à 17:19:26    

tu as essayé la version corrigée ? (cd "$i" )

Reply

Marsh Posté le 07-08-2005 à 17:45:16    

oui

Reply

Marsh Posté le 07-08-2005 à 18:45:22    

en faite il faut "protéger" la sortie de find

Code :
  1. for i in "`find ./ -maxdepth 1 -type d `"; do

Reply

Marsh Posté le 07-08-2005 à 20:20:04    

Non dsl, cette fois il arrive même pas à rentrer dans les répertoire sans espaces.
Mais ne te sens pas obliger de te casser la tête, j'ai une methode qui marche donc c'est ok.

Reply

Marsh Posté le 07-08-2005 à 20:53:29    

Non je ne me casse pas la tête :) mais j'essaye simplement d'intégrer un find dans une boucle car je risque d'utiliser l'algorithme bientôt.
Bon je viens de trouver une autre solution que la boucle for

Code :
  1. find ./ -maxdepth 1 -type d | tail +2 | while read l


avec "$l" contenant le nom du répertoire.

Reply

Marsh Posté le 08-08-2005 à 22:35:39    

Dsl, je débute en script. Je veux bien tester ta commande mais je n'ai pas compris comment l'intégrer dans le script. Et la variable I n'intervient pas?

Reply

Marsh Posté le 08-08-2005 à 22:43:15    

En fait cette ligne remplace celle contenant "for..."
sachant qu'il ne faut pas oublier de remplacer "while read l" par "while read i" pour que ce soit en concordance avec l'ancien script.
 
donc : "find ./ -maxdepth 1 -type d" -> on récupère tous les dossiers contenu à la racine de notre répertoire
tail +2 : en fait dans la liste des répertoires retournés, il figure en première place le répertoire "./" qui est le répertoire courant. Si tu ne veux pas créer un repertoire ok dans le répertoire suivant alors cette commande te conviendra sinon supprime la.
while read l : on récupère les noms des dossiers un par un


Message édité par jlighty le 08-08-2005 à 22:43:41
Reply

Marsh Posté le 09-08-2005 à 10:54:17    

OUI cette fois ça marche c'est tout bon!
Une des raisons que je n'avais pas compris c'est que j'avais lu "while read 1 ("un" ) au lieu de "I".(ils s'affichent identiquement sur sur mon écran)
En fait ta solution m'arrange même plus puisque maintenant, dans mon vrai script je suis en train de galérer sur la récursivité. Et avec find, il n'y a plus de problème!
Merci beaucoup du coup de main.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed