Como eu amo linux pqp
Eu tô brincando com stable diffusion aqui
Aí eu baixei vários modelos, só que os modelos tem versoes diferentes
E eu tava organizando eles, no caso eu queria encontrar quais modelos da minha pasta de modelos são da versão 1.5
então eu fiz um grep pra entrar no arquivo de config desses modelos e printar pra mim o nome do arquivo de cada modelo que tem essa versão
Aí eu fiz um find pra todos os arquivos que tem esse mesmo nome do modelo (que é a foto do modelo, a config e o modelo em si)
E movi todos pra pasta da versão deles
Assim eu tenho ctz que separei tudo certinho e eu não preciso ficar olhando 1 por 1 nos arquivos de config e selecionando e movendo manualmente
Se liga o comando completo
grep --include=\*.civitai.\* --exclude-dir=SD_1.5 -rl ./ -e '"baseModel": "SD 1.5"'
| grep -oP '([^\./]+)(?=\.civitai)'
| while read f; do find . -maxdepth 1 -name "*$f*" -exec mv -t ./SD_1.5 {} +; done
No primeiro grep
tu tem:
--include=\*.civitai.\*
pega qqr arquivo q tenha civitai em algum lugar dele (o arquivo de config)
--exclude-dir=SD_1.5
pq ja tem arquivo dentro dessa pasta (q e a pasta onde to movendo os modelos) e n quero buscar nela
-r
busca recursiva em uma pasta
-l
retorna o nome do arquivo que a busca corresponder
-e
o pattern que tu ta buscando dentro do arquivo
ai no segundo grep
tem um regex do Perl -P
e o -o
faz o retornar so oq der match no regex, o regex seleciona so a parte do nome do arquivo (foo.civitai.bar
vai virar foo
)
e dps tem um while
que le linha por linha o output desse ultimo grep (que ta o nome da cada modelo q deu match) e cria uma variavel f
com essa variavel tu faz um find
no diretorio q tu ta, o -maxdepth 1
pq eu n quero recursivo, o *$f*
usa a variavel criada, os * pq vai pegar qqr arquivo que tenha o nome do modelo no nome do arquivo, dps tu tem um -exec
pra executar outro comando qnd vc achar algum arquivo no find, no caso o mv
que move o arquivo pro diretorio especificado no -t
(que e variavel do mv ja n do find) e o {} +
e a sintaxe do find pra fechar um exec executando o minimo possivel o comando, entao no caso ai o mv vai registrar todos os arquivos e executar 1x apenas e nao 1x pra cada arquivo. e tu fecha o while 😄