Primeiro, ligue a globalização recursiva
shopt -s globstar
Agora podemos procurar em todos os diretórios com **
. Para cancelar a configuração, você pode usar shopt -u globstar
(está desativado por padrão, portanto, será desativado quando você abrir um novo shell).
Em todos os itens abaixo, remova echo
após o teste para criar os diretórios.
Se os diretórios de fim de árvore estiverem vazios, você pode testar o vazio e criar o diretório apenas se for detectado ... algo como
for d in **/; do [[ -z "$(ls -Aq "$d")" ]] && echo mkdir "$d"Texture; done
i.e. se a saída de ls -A (hidden files except current and parent dir) -q (printing ? for non-printing characters)
estiver vazia, crie um diretório.
Mas como os diretórios contêm arquivos, é melhor testarmos que não há diretórios
for d in **/; do [[ -z "$(find "$d" -maxdepth 1 -mindepth 1 -type d)" ]] && echo mkdir "$d"Texture; done
mindepth -1
é para impedir que o diretório atual seja encontrado ... find
vê arquivos ocultos, por isso sabemos que eles estão incluídos. Como qualquer personagem deve passar no teste (queremos apenas verificar se a saída está vazia), isso deve ser bastante seguro ...
Uma maneira mais concisa (desculpe Greg) (mas, na verdade, todos esses métodos fazem algo similarmente duvidoso - podemos simplesmente fugir com o uso de nomes de arquivos como texto, já que na verdade não estamos tentando fazer nada com esses arquivos aqui):
for d in **/; do (ls -Alq "$d" | grep -q '^d') || echo mkdir "$d"Textures; done
aqui adicionamos o sinalizador -l
para a saída longa, que imprime todos os arquivos no formato
drwxrwxr-x 5 zanna zanna 4096 Sep 27 22:00 Dir1
nós então gulp canalizamos esse material em grep
para ver se alguma das linhas começa com d
(o que significa que há um diretório). Não queremos que grep
imprima nada desse texto não-confiável sem sentido, então apenas verificamos seu status de saída com -q
para ver se encontrou algo. Caso contrário, criamos um diretório (usando o ||
ou operador, ou seja, faça o próximo comando se o último falhar). Isso deve funcionar, na verdade, mesmo que seus nomes de arquivo contenham caracteres horríveis como newlines, pois ls
os imprime como ?
- cada linha deve iniciar com uma letra indicando o tipo de arquivo, então provavelmente nenhum gatinho morrerá.