Re: script bash basename

トップ ページ

このメッセージに返信
著者: rene.ribaud
日付:  
To: anne guilde
CC: ML Guilde
題目: Re: script bash basename
Bonjour,

>>répertoire de base /home/anne/toto/
>>il faut que je récupère tout ce qui est après le nom du répertoire de base.


Je pense que cette méthode répond à la problématique :

[uggla@ugglalaptop ~]$ dir='/home/anne/toto/rep1/rep11/fich41'
[uggla@ugglalaptop ~]$ prefix='/home/anne/toto'
[uggla@ugglalaptop ~]$ echo ${dir#"$prefix"}
/rep1/rep11/fich41

Cela vient de :
${parameter#word}
${parameter##word}

    The word is expanded to produce a pattern just as in filename expansion (see Filename Expansion). If the pattern matches the beginning of the expanded value of parameter, then the result of the expansion is the expanded value of parameter with the shortest matching pattern (the ‘#’ case) or the longest matching pattern (the ‘##’ case) deleted. If parameter is ‘@’ or ‘*’, the pattern removal operation is applied to each positional parameter in turn, and the expansion is the resultant list. If parameter is an array variable subscripted with ‘@’ or ‘*’, the pattern removal operation is applied to each member of the array in turn, and the expansion is the resultant list.



https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html#Shell-Parameter-Expansion

Désolé je n'ai pas trouvé de version en Français.

Cordialement.
René


----- Mail original -----
De: "anne guilde" <anne.guilde@???>
À: "ML Guilde" <guilde@???>
Envoyé: Jeudi 25 Février 2016 22:41:30
Objet: script bash basename

bonjour,

Je veux trouver tous les fichiers normaux d'un répertoire et de ses
sous-répertoire

# répertoire de recherche
/home/anne/toto/

avec la commande find je me retouve avec

/home/anne/toto/fich1
/home/anne/toto/fich2
/home/anne/toto/fich3
/home/anne/toto/rep1/fich4
/home/anne/toto/rep1/fich5
/home/anne/toto/rep2/fich6
/home/anne/toto/rep3/fich7

J'ai un répertoire /home/anne/titi/

Je veux vérifier si tous les fichiers qui sont dans toto existe dans
titi et ont le même contenu

J'ai fait un petit script bash

-----
#!/bin/bash

# repertoire recherche
repertdiff='/home/anne/resupt-rech/'
# repertoire old
listeold=( $(find /home/anne/toto -type f) )
# repertoire new
listenew='/home/anne/titi/'

nb_element=${#listeold[@]}

index=0

while [ "$index" -lt "$nb_element" ]
do    # Liste tous les elements du tableau.
   echo ${listeold[$index]}
   # recherche du nom du fichier
   nomfich=$(basename  ${listeold[$index]} )
   echo $nomfich
   # nom fichier avec le repertoire titi
   fichnew="$listenew$nomfich"
   echo $fichnew
   # nom de fichier pour la recherche du diff
   fichrech="$repertdiff$nomfich"
   # diff
   diff ${listeold[$index]}  $fichnew > $fichrech
   let "index = $index + 1"
   # ou index+=1 avec Bash 3.1 et suivants
done
-----


Je me suis servie de basename pour récupérer le nom du fichier.
Je n'avais pas pensé aux sous-répertoires quand j'ai pondu mon script.

avec '/home/anne/toto/rep1/fich4' Comment faire pour récupérer
'rep1/fich4'

avec '/home/anne/toto/rep1/rep11/fich41' Comment faire pour récupérer
'rep1/rep11/fich41'

avec basename je me retrouve avec fich4 sans son répertoire

répertoire de base /home/anne/toto/
il faut que je récupère tout ce qui est après le nom du répertoire de base.

merci pour vos lumières
Anne