Dada la siguiente estructura de directorios:
$ tree --noreport dir
dir
├── fileA
├── .hiddenfileA
├── .hiddendirA
| ├── .hiddenfileB
│ ├── fileC
│ └── fileD
└── dirA
├── .hiddenfileC
├── fileE
└── fileF
El requisito es realizar una llamada para buscar para que los archivos de directorios ocultos pero no los archivos ocultos (en directorios no ocultos) se excluyan del resultado.
El rendimiento esperado debería ser algo similar a:
./.hiddenfileA
./dirA/.hiddenfileC
./dirA/fileE
./dirA/fileF
./fileA
Investigué un poco y encontréaquíinformación que me llevó a crear la siguiente llamada afind
$ find . -type f -not -path '*/\.*' -print
Pero esta solución tiene el inconveniente de que se salta directorios ocultos.y archivos.
Respuesta1
Pode los directorios ocultos y limite los resultados a archivos:
find . -type d -name '.?*' -prune -o -type f -print
Como lo sugierejthill, es posible que prefieras filtrar directorios, lo que daría como resultado que se muestren archivos, enlaces, etc.:
find . -type d -name '.?*' -prune -o ! -type d -print
Respuesta2
El comando que tienes está muy cerca de funcionar. Usar
find . -type f ! -path '*/.*/*' -print
- El patrón de ruta,
*/.*/*
busca un/.
(lo que implica un nombre de segmento que comienza con.
) seguido(eventualmente)pora/
- entonces el nombre del segmento que comienza con.
no puede ser el último (el nombre del archivo); es decir, debe ser un nombre de directorio. -path
utiliza patrones de expansión de nombres de archivos; también conocidos como globos o comodines. Entonces no necesitas poner\
antes.
.- No lo use
-not
si desea portabilidad a sistemas que no sean GNU. El uso de!
para representar "no" está especificado por POSIX y funciona en todas las versionesfind
(incluso BSD, Solaris, etc., y sistemas antiguos).