2010-10-25 5 views
26

Contexte rapide:Bash boucle sur des répertoires

$ ls src 
file1 file2 dir1 dir2 dir3 

Script:

#!/bin/bash 

for i in src/* ; do 
    if [ -d "$i" ]; then 
    echo "$i" 
    fi 
done 

Sortie:

src/dir1 
src/dir2 
src/dir3 

Cependant, je le veux lire:

dir1 
dir2 
dir3 

Maintenant, je me rends compte que je pourrais sed/awk la sortie pour supprimer "src /" mais je suis curieux de savoir s'il y a une meilleure façon d'y parvenir. Peut-être utiliser un find + while-loop à la place.

Répondre

16

Est-ce que ce lieu pour la echo ligne:

echo $(basename "$i") 
+0

Je vois que vous avez mis à jour votre message à lire * basename * au lieu de * dirname * ding, ding, ding CORRECT !!! : D Merci, j'accepterai votre réponse – BassKozz

+0

J'ai appris cette pépite il y a seulement 2 jours à partir d'un livre O'Rielly. Aurait pu me sauver des heures de sedfoolery si je le savais il y a des années. – Synesso

3

Utilisez basename comme:

if [ -d "$i" ]; then 
    basename "$i" 
fi 
10

Pas besoin de bifurquer un processus externe:

echo "${i##*/}" 

Il utilise le « enlever le plus long préfixe correspondant "parameter expansion. Le */ est le motif, donc il supprimera tout depuis le début de la chaîne jusqu'à la dernière barre oblique inclusivement. S'il n'y a pas de barre oblique dans la valeur $i, alors c'est la même chose que "$i".

Cette extension de paramètre particulière est specified in POSIX et fait partie de l'héritage de la coque Bourne originale. Il est pris en charge dans toutes les coquilles de type Bourne (sh , cendres, tiret, ksh, bash, zsh, etc.). La plupart des shells riches en fonctionnalités (par exemple ksh, bash et zsh) ont d'autres extensions qui peuvent gérer encore plus sans impliquer de processus externes.

8

Si vous faites un cd au début du script, il devrait être annulé lorsque le script se termine.

#!/bin/bash 

cd src 
for i in * ; do 
    if [ -d "$i" ]; then 
    echo "$i" 
    fi 
done 
+2

il devrait ... mais si vous utilisez la commande '.' ou' source' pour invoquer le script, ce ne sera pas le cas. Utilisez plutôt 'pushd' et' popd'. – Benoit

Questions connexes