¿Cómo puedo hacer que bash no coincida con `.` y `..` con `.*`?

¿Cómo puedo hacer que bash no coincida con `.` y `..` con `.*`?

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 GLOBIGNOREvariable 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 .!(.|)

información relacionada