Eu tenho uma hierarquia de arquivos como:
data
├── debug.log
├── messages
│ ├── msg001.txt
│ ├── msg002.txt
│ └── msg003.txt
└── pictures
├── msg002
│ └── pic001.jpg
└── msg003
├── pic001.jpg
└── pic002.jpg
Gostaria de encontrar todos os arquivos e todos os diretórios abaixo dos dois níveis superiores (dados, dados/mensagens e dados/imagens). Todas as coisas que não fazem parte da estrutura fixa da hierarquia, se isso faz sentido.
Posso fazer isso com uma única invocação de localização?
Posso encontrar os arquivos:
$ find data -type f | sort
data/debug.log
data/messages/msg001.txt
data/messages/msg002.txt
data/messages/msg003.txt
data/pictures/msg002/pic001.jpg
data/pictures/msg003/pic001.jpg
data/pictures/msg003/pic002.jpg
E posso encontrar os diretórios:
$ find data -mindepth 2 -type d | sort
data/pictures/msg002
data/pictures/msg003
Mas não posso combiná-los, porque -minprofundidade é uma opção, não um teste:
$ find data -type f -o \( -mindepth 2 -type d \) | sort
find: warning: you have specified the -mindepth option after a non-option argument -type, but options are not positional (-mindepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.
data/messages/msg001.txt
data/messages/msg002.txt
data/messages/msg003.txt
data/pictures/msg002
data/pictures/msg002/pic001.jpg
data/pictures/msg003
data/pictures/msg003/pic001.jpg
data/pictures/msg003/pic002.jpg
(observe que data/debug.log não é encontrado aqui)
Existe alguma maneira de considerar a profundidade da hierarquia como um teste real?
O melhor erro que consigo pensar é usar um regexp no caminho para reconhecer os dois níveis principais de diretórios:
$ find data -type f -o \( -type d -regextype posix-extended \! -regex 'data(/[^/]+)?' \) | sort