
Cuando intento hacer coincidir todos los archivos dot en un directorio, .*
parece tener un efecto secundario desagradable: además de hacer coincidir todos los archivos y directorios (reales), coincide con .
y ..
.
bash-3.2$ mv test/.* dest/
mv: rename test/. to dest/.: Invalid argument
mv: test/.. and dest/.. are identical
Esto parece realmente extraño, ya que son básicamente directorios "falsos", que están ahí para facilitar las rutas relativas. No son parte del contenido de un directorio y nunca quiero que coincidan cuando intento mover el contenido de un directorio a otro. No se me ocurre ningún escenario en el que quisiera que coincidieran con .*
.
Entonces, ¿cómo puedo desactivar esto? (Además de usar el shell Z, que no siempre está disponible y que puede no ser el shell que utiliza alguien que ejecuta una función que he escrito).
Respuesta1
Puedes usar la GLOBIGNORE
variable bash.
GLOBIGNORAR Una lista de patrones separados por dos puntos que definen el conjunto de nombres de archivos para ser ignorado por la expansión del nombre de ruta. Si un nombre de archivo coincide con un El patrón de expansión del nombre de ruta también coincide con uno de los patrones en GLOBIGNORE, se elimina de la lista de coincidencias.
y
........................-. Los nombres de archivo ``.'' y ``..'' siempre son se ignora cuando GLOBIGNORE está configurado y no es nulo.
Entonces si configuras
GLOBIGNORE='*/.:*/..'
entonces path/.*
no coincidirá con .
y ..
, como lo pides.
Respuesta2
Un patrón global sería .[^.]*
: coincide con algo con al menos 2 caracteres donde el segundo carácter no es un punto.
La documentación para la coincidencia de patrones de nombres de archivos se encuentra en la página de manual de bash o aquí:http://www.gnu.org/software/bash/manual/bash.html#Pattern-Matching
Jonathan Callen plantea un buen punto. Puedes usar un patrón extendido bastante simple.
shopt -s extglob
ls -d .!(.|)