bash - usan - mover todos los archivos de un directorio a otro en linux
Bash for loop con comodines y archivos ocultos (4)
Solo con un simple script de shell y un poco confundido:
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*"
Obtengo esta salida:
Processing *bash* file..
Este no es el resultado esperado y no es lo que espero. ¿No se me permite tener un comodín al principio del nombre del archivo? Es el . al principio del nombre de archivo "especial" de alguna manera?
Ajuste
FILES="bash*"
Tampoco funciona.
El globbing predeterminado en bash no incluye los nombres de archivo que comienzan con a. (también conocidos como archivos ocultos).
Puedes cambiar eso con
shopt -s dotglob
$ ls -a
. .. .a .b .c d e f
$ ls *
d e f
$ shopt -s dotglob
$ ls *
.a .b .c d e f
$
Para volver a desactivarlo, ejecute shopt -u dotglob
.
Si desea ocultos y no ocultos, configure dotglob (bash)
#!/bin/bash
shopt -s dotglob
for file in *
do
echo "$file"
done
Si el en la parte frontal es especial, y normalmente no se comparará con un comodín *
, como se documenta en la página de manual de bash (y es común a la mayoría de los shells de Unix):
Cuando se usa un patrón para la expansión de la ruta de acceso, el carácter “.” Al comienzo de un nombre o inmediatamente después de una barra debe coincidir explícitamente, a menos que se establezca la opción de shell dotglob . Al hacer coincidir un nombre de ruta, el carácter de barra diagonal siempre debe coincidir explícitamente. En otros casos, el carácter "." No se trata especialmente.
FILES=".bash*"
funciona porque el nombre de los archivos ocultos comienza con a .
FILES="bash*"
no funciona porque el nombre de los archivos ocultos comienza con a .
no una b
FILES="*bash*"
no funciona porque el comodín *
al principio de una cadena omite los archivos ocultos.