2010-01-25 10 views
16

Sólo witting un script de shell simple y poco confundido:Bash para el lazo con los comodines y los archivos ocultos

Aquí está mi guión:

% for f in $FILES; do echo "Processing $f file.."; done 

el comando:

ls -la | grep bash 

produce:

% ls -a | grep bash 
.bash_from_cshrc 
.bash_history 
.bash_profile 
.bashrc 

Cuando

FILES=".bash*" 

obtengo los mismos resultados (formato diferente) que ls -a. Sin embargo, cuando

FILES="*bash*" 

puedo obtener este resultado:

Processing *bash* file.. 

Ésta no es la salida esperada y no lo que yo esperaba. ¿No se me permite tener un comodín al comienzo del nombre del archivo? Es el . al principio del nombre de archivo "especial" de alguna manera?

Configuración

FILES="bash*" 

tampoco funciona.

+1

Como se ha dicho núms a continuación, es probable que desee utilizar un indicador bash para modificar el comportamiento. (shopt -s dotglob) –

Respuesta

6

FILES=".bash*" obras porque los archivos ocultos nombrar comenzar con una .

FILES="bash*" no funciona porque los archivos ocultos nombrar empezar no es un . un b

FILES="*bash*" no funciona porque el comodín al * el comienzo de una cadena omite los archivos ocultos.

+6

Entonces, si quiero hacerlo, debería hacer FILES = ". * bash *"? Pero, ¿y si quiero archivos escondidos Y no ocultos? – sixtyfootersdude

10

Sí, el . en la parte delantera es especial, y normalmente no se corresponde con un comodín *, como se documenta en la página del manual de bash (y común a la mayoría de los comandos Unix):

Cuando una patrón se utiliza para la expansión del nombre de ruta, el carácter “. ” al comienzo de un nombre o inmediatamente después de una barra debe coincidir explícitamente, a menos que la opción de shell dotglob sea establecer. Al hacer coincidir un nombre de ruta, el carácter de barra inclinada debe coincidir siempre de forma explícita. En otros casos, el “. ” personaje no se trata especialmente.

41

El globbing predeterminado en bash no incluye nombres de archivo que comiencen por a. (también conocidos como archivos ocultos).

Usted puede cambiar eso con dotglob

shopt -s

$ ls -a 
. .. .a .b .c d e f 
$ ls * 
d e f 
$ shopt -s dotglob 
$ ls * 
.a .b .c d e f 
$ 

Para desactivar de nuevo, ejecute shopt -u dotglob.

+0

¡Siempre me olvido de shopt! Gracias por esta respuesta! –

8

Si desea ocultos y no ocultos, establecer dotglob (bash)

#!/bin/bash 
shopt -s dotglob 
for file in * 
do 
echo "$file" 
done 
Cuestiones relacionadas