Excluir arquivos de diretórios ocultos, mas não arquivos ocultos (em diretórios não ocultos) dos resultados da localização

Excluir arquivos de diretórios ocultos, mas não arquivos ocultos (em diretórios não ocultos) dos resultados da localização

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.
  • -pathusa 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 -notse quiser portabilidade para sistemas não-GNU. O uso de  ! para representar “não” é especificado pelo POSIX e funciona em todas as versões find (até mesmo BSD, Solaris, etc., e sistemas antigos).

informação relacionada