exemplo:
- procurar uma pasta
*foo
- dentro das pastas
*foo
achar um arquivo copiado que foi renomeado como nomedoarquivo-copia.extensão
- com base no nome do arquivo copiado achar o arquivo original
- achando o arquivo original encontrar arquivos da mesma data do original
sei que o comando find
acha os arquivos de acordo com os parametros que quero mas não consegui juntar os parametros de forma que as propriedades de um arquivo sejam parametro para a proxíma pesquisa.
a solução pode ser bash ou python mas não pode quebrar com arquivos que tenham caracteres especiais no nome como !?*&|()<>@
alguns arquivos contém até caracteres japoneses e emojis
sei que characteres especiais são má pratica e que dificultam a manipulação mas e que aqui saiu de controle.
Realmente não tem como fazer isso, os testes do find
são completamente independentes.
Porém, com um uso defensivo do shell, dá para fazer um script em bash que funciona mesmo com caracteres especiais.
#!/bin/bash
# globstar = **, que permite buscas recursivas (assim como o find)
# nullglob = zerar buscas sem resultado
shopt -s globstar nullglob
for pasta in ./**/*foo/; do
for copia in "$pasta"/*-copia.ext; do
# vai que é uma pasta né
[ -f "$copia" ] || continue
# Remover o sufixo (%) -copia.ext
# Use aspas simples depois do % para caracteres especiais no sufixo não quebrarem o script.
original="${copia%'-copia.ext'}.ext"
# extrair a data de modificação.
# o -- impede que um arquivo começando com - seja interpretado como opção
# o LC_ALL=C garante que o formato será consistente mesmo que o sistema esteja em outro idioma
read -r data _ <<< "$(LC_ALL=C stat -c%y -- "$original")"
# ver arquivos do tal dia
find "$pasta" -newermt "$data" ! -newermt "$data + 1 day"
done
done
Pode usar mapfile
e find ... -print0
para colocar esses arquivos com caracteres dentro de uma array, mas fica como exercício para o leitor.
2 curtidas