Dada a seguinte estrutura de diretórios:
$ tree --noreport dir
dir
├── fileA
├── .hiddenfileA
├── .hiddendirA
| ├── .hiddenfileB
│ ├── fileC
│ └── fileD
└── dirA
├── .hiddenfileC
├── fileE
└── fileF
O requisito é fazer uma chamada para encontrar para que os arquivos de diretórios ocultos, mas não os arquivos ocultos (em diretórios não ocultos), sejam excluídos do resultado.
O retorno esperado deve ser algo semelhante a:
./.hiddenfileA
./dirA/.hiddenfileC
./dirA/fileE
./dirA/fileF
./fileA
Fiz algumas pesquisas e descobriaquiinformações que me levaram a criar a seguinte chamada parafind
$ find . -type f -not -path '*/\.*' -print
Mas esta solução tem a desvantagem de ignorar diretórios ocultose arquivos.
Responder1
Remova diretórios ocultos e limite os resultados a arquivos:
find . -type d -name '.?*' -prune -o -type f -print
Como sugerido porjthill, você pode preferir filtrar diretórios, o que resultaria na exibição de arquivos, links etc.:
find . -type d -name '.?*' -prune -o ! -type d -print
Responder2
O comando que você tem está muito perto de funcionar. Usar
find . -type f ! -path '*/.*/*' -print
- O padrão de caminho,
*/.*/*
, procura por a/.
(implicando um nome de segmento que começa com.
) seguido(eventualmente)pora/
- então o nome do segmento que começa com.
não pode ser o último (o nome do arquivo); ou seja, deve ser um nome de diretório. -path
usa padrões de expansão de nome de arquivo; também conhecidos como globs ou curingas. Então você não precisa colocar\
antes.
.- Não use
-not
se quiser portabilidade para sistemas não-GNU. O uso de!
para representar “não” é especificado pelo POSIX e funciona em todas as versõesfind
(até mesmo BSD, Solaris, etc., e sistemas antigos).