2010-10-25 28 views
26

Antecedentes rápida:Bash Para-Loop en Directorios

$ ls src 
file1 file2 dir1 dir2 dir3 

Guión:

#!/bin/bash 

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

Salida:

src/dir1 
src/dir2 
src/dir3 

Sin embargo, desea que diga:

dir1 
dir2 
dir3 

Ahora me doy cuenta de que podría echar/sacudir la salida para eliminar "src /", pero tengo curiosidad por saber si hay una manera mejor de solucionar esto. Tal vez utilizando un find + while-loop en su lugar.

Respuesta

16

haga esto en lugar de la línea echo:

echo $(basename "$i") 
+0

veo que has actualizado tu post para leer * * nombre base en lugar de * * dirname ding, ding, ding CORRECTO !!! : D Gracias, voy a aceptar su respuesta – BassKozz

+0

Aprendí esta pepita hace solo 2 días de un libro de O'Rielly. Podría haberme ahorrado horas de payasadas si lo hubiera sabido años atrás. – Synesso

3

Uso basename como:

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

No hay necesidad de que se bifurcan un proceso externo:

echo "${i##*/}" 

Utiliza el “Eliminar el prefijo de coincidencia más largo "parameter expansion. El */ es el patrón, por lo que eliminará todo, desde el comienzo de la cadena hasta la última barra inclinada incluida. Si no hay una barra en el valor de $i, entonces es lo mismo que "$i".

Esta expansión de parámetro particular es specified in POSIX y es parte del legado del shell Bourne original. Se apoya en todas las conchas Bourne-como (sh, ceniza, dash, ksh, golpe, zsh, etc.). Muchos de los shells ricos en características (por ejemplo, ksh, bash y zsh) tienen otras expansiones que pueden manejar aún más sin involucrar procesos externos.

8

Si hace un cd al comienzo de la secuencia de comandos, se debe revertir cuando se cierra la secuencia de comandos.

#!/bin/bash 

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

debería ... pero si usa el comando '.' o' source' para invocar el script, no lo hará. Más bien use 'pushd' y' popd'. – Benoit