Communauté Informatique NDFR.net

Communauté Informatique NDFR.net (http://www.ndfr.net/forums/index.php)
-   Unix/Linux Client (http://www.ndfr.net/forums/forumdisplay.php?f=53)
-   -   Un peu de bash... (http://www.ndfr.net/forums/showthread.php?t=6915)

KnuX 06-12-2005 16:53

Un peu de bash...
 
Yop :)

Je cherche à faire un script qui parcours un répertoire en prenant en compte aussi bien les fichiers contenants des espaces ainsi que ceux commençant par un point.

La syntaxe de ce script serait la suivante : monscript <source_a_parcourir>
Donnant ainsi :
Quote:

$ monscript Source/
----

Soit un dossier source à parcourir :
Quote:

$ tree -a Source/
Source/
|-- dossier avec espaces
| |-- .hidden
| |-- fichier avec espaces
| `-- fichier_sans_espace
`-- dossier_sans_espace
|-- .hidden
|-- fichier avec espaces
`-- fichier_sans_espace

2 directories, 6 files
Pour chacun de ces fichiers, je veux donc pouvoir préciser des actions en fonction du type, de la date, etc. Bref, une liste d'instructions.

J'ai trouvé la commande "find" munie de son option "-exec" qui permet d'exécuter une commande en connaissant le fichier parcouru. Ok, mais elle ne m'aide pas, je n'ai pas trouvé moyen de lui préciser une suite d'instruction bash sans avoir mon script en deux fichiers.

Ensuite, j'ai trouvé le parcours des résultats de find, avec un for :
Code:

$ for i in $(find Source/); do echo "-> $i"; done;
Seulement le résultat laisse à désirer... Il sépare bien les fichiers mais aussi quand il y a des espaces :(
Quote:

-> Source/
-> Source/dossier
-> avec
-> espaces
-> Source/dossier
-> avec
-> espaces/fichier_sans_espace
-> Source/dossier
-> avec
-> espaces/fichier
-> avec
-> espaces
-> Source/dossier
-> avec
-> espaces/.hidden
-> Source/dossier_sans_espace
-> Source/dossier_sans_espace/fichier_sans_espace
-> Source/dossier_sans_espace/fichier
-> avec
-> espaces
-> Source/dossier_sans_espace/.hidden
En continuant de chercher, j'obtiens le code suivant :
Code:

$ for i in Source/*; do echo "-> $i"; done;
Mais ce n'est ni récursif (à moins d'imbriquer des for ?) et il me faudra faire en double pour les fichiers cachés (commençant par un point).
Quote:

-> Source/dossier avec espaces
-> Source/dossier_sans_espace
Quelqu'un aurait une idée ?
Je pensais à convertir les espaces par un motif, à la sortie du find, mais si un de mes fichiers vient à contenir le motif, c'est fichu...

La manière dont le "*" ne cause pas problème pour les espaces tandis qu'avec le "find", ça foire, ça m'épate ! :)

KnuX 06-12-2005 22:05

Une solution trouvée :

Code:

find Source/* | while read i; do echo "-> $i"; done
Quote:

-> Source/dossier avec espaces
-> Source/dossier avec espaces/fichier_sans_espace
-> Source/dossier avec espaces/fichier avec espaces
-> Source/dossier avec espaces/.hidden
-> Source/dossier_sans_espace
-> Source/dossier_sans_espace/fichier_sans_espace
-> Source/dossier_sans_espace/fichier avec espaces
-> Source/dossier_sans_espace/.hidden
Par contre, si je veux faire un prompt pour confirmer une action sur un fichier par exemple, je ne peux pas utiliser "read UneVariable" pour récupérer la réponse de l'utilisateur puisque je suis déjà dans un read :(


All times are GMT +2. The time now is 04:36.

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.