abordagem alternativa para exclusões seletivas da árvore rsnapshot com find?

1

Estou procurando uma solução generalizável para esse problema, porque tenho certeza de que ele surgirá novamente.

Eu tenho um cliente que faz pesquisa médica. Periodicamente, temos que remover os conjuntos de dados fornecidos pela autoridade de saúde local e atestar o fato de que fizemos isso com segurança.

Usamos o rsnapshot com uma retenção de

7 dailies, 
4 weeklies, 
12 monthlies, 
4 yearlies.

Recentemente, precisei limpar a árvore de rsnapshot de dados antigos que se pareciam muito com isso no local de origem:

/path/to/studyName/data files yyyy mm 01/bunchOfFiles
/path/to/studyName/data files yyyy mm 02/bunchOfFiles
/path/to/studyName/data files yyyy mm 03/bunchOfFiles
/path/to/studyName/randomly placed and named data file 1
/path/to/studyName/randomly named admin file to keep 1
/path/to/studyName/randomly placed and named data file 2
/path/to/studyName/randomly placed and named data file 3
/path/to/studyName/randomly named admin file to keep 2
/path/to/studyName/randomly named admin file to keep 3
/path/to/studyName/randomly placed and named data file 4
/path/to/studyName/randomly named admin file to keep n
/path/to/studyName/randomly placed and named data file 5

Observe que os subdiretórios ./data * também ocorrem em muitos outros locais de estudo, portanto, não são úteis como destinos de pesquisa.

O que eu gostaria de ter feito envolveria encontrar com alguns comandos -exec aninhados. Mas achado não pode fazer isso.

Eu tentei aninhar um -exec usando o bash -c dentro do primeiro -exec comando. Depois de stubbing meus dedos em todos os tipos de coisas que eu precisava para lidar (como os espaços nos nomes dos subdiretórios), meu temporizador acabou, e tornou-se mais rentável para apenas fazer uma coleção gigante de comandos rm delete cada instância do arquivo (ou subdiretório contendo arquivos de dados).

por exemplo, se fosse possível aninhar -execs, acho que isso funcionaria:

find /path/to/rsnapshot_tree -type d -name studyName / 
  -exec 'find {}  -type d -iname "data files* -exec rm -rf {} \;'

OK - não pode funcionar por causa da ambiguidade da terminação -exec e {}, mas pense nisso como pseudo-código

essencialmente,

  • encontre cada instância do diretório "studyName" no rshapshot árvore, em seguida, aplique rm-rf para os 3 diretórios descritos por "dados arquivos * "
  • Em seguida, repita para cada instância de arquivos de dados perdidos na tela. diretório studyName.

6 comandos, em vez do > 150 eu tive que copiar, colar, editar e acertar em um script.

Qualquer sugestão sobre uma maneira melhor seria muito apreciada.

Eu tenho árvores rsnapshot hospedadas em ambos os hosts linux (debian / ubuntu) e freeBSD. Bash é sempre o shell (eu mudo o padrão nos hosts do freeBSD)

    
por BISI 29.01.2016 / 01:52

1 resposta

1

sua pergunta não está totalmente clara para mim, mas se você tiver uma estrutura de diretórios como segue -

a
a/data
a/data/file1
a/studyName
a/studyName/data
a/studyName/data/file1
a/studyName/data/file2
a/studyName/data/file3

e você está procurando por studyName / data / fileX, você poderia fazer -

find  . -path "*studyName/data*" -type f
./a/studyName/data/file1
./a/studyName/data/file2
./a/studyName/data/file3
    
por 29.01.2016 / 07:03