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