Re: script bash basename

Page principale

Répondre à ce message
Auteur: anne.guilde@free.fr
Date:  
À: rene.ribaud
CC: ML Guilde
Sujet: Re: script bash basename
Le 26/02/2016 14:47, rene.ribaud@??? a écrit :
> 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.
>


Je ne connaissais pas. merci

Je mets mon nouveau script.
J'ai testé avec un répertoire sans sous-répertoire.

----
#!/bin/bash

# repertoire recherche
repertdiff='/chemin-fichier/result-rech'
# repertoire old
repertold='/chemin-fichier-1/repertoire-old'
listeold=( $(find $repertold -type f) )
# repertoire new
listenew='/chemin-fichier-2/repertoire-new'

nb_element=${#listeold[@]}

index=0

while [ "$index" -lt "$nb_element" ]
do
# Liste tous les elements du tableau : elements en cours
echo 'fichier recherche en cours : ' ${listeold[$index]}

# recherche du nom du fichier sans préfixe
nomfich=${listeold[$index]#"$repertold"}
###nomfich=$(basename ${listeold[$index]} )
echo 'base du fichier de recherche : ' $nomfich

# nom fichier avec le repertoire asterisk
fichnew="$listenew$nomfich"
echo 'nom du fichier new : ' $fichnew

# nom de fichier pour la recherche du diff
fichrech="$repertdiff$nomfich"
echo 'nom du fichier du resultat du diff : ' $fichrech

# diff
diff ${listeold[$index]} $fichnew > $fichrech

echo '-----------'
let "index = $index + 1"
# ou index+=1 avec Bash 3.1 et suivants
done
----

Je suis en train de copier des données.
Je pourrais tester le script avec une recherche avec répertoire et
sous-répertoire.

Merci à tous pour toutes les solutions proposées.


diff /chemin-fichier-1/repertoire-old /chemin-fichier-2/repertoire-new
> /chemin-fichier/test-diff

=>
diff /chemin-fichier-1/repertoire-old/fich1
/chemin-fichier-2/repertoire-new/fich1
15c15
< astmoddir => /usr/lib64/xxxx/modules
---
> astmoddir => /usr/lib/xxxk/modules

Seulement dans /etc/xxxx: backup
Seulement dans /etc/xxxx: ccss.conf
...

J'aimerais récupérer toutes les lignes qui commencent par 'Seulement'
et seulement celle-là

Anne