Comando Find: condições múltiplas

7

Como padrão para minha nomeação de arquivo / dir, eu uso algo como colocar data e tags string no nome do arquivo, separadas por sublinhado, por exemplo:

2015_03_10_usa_nyc_vacations_album_pictures

Por muito tempo eu usei programas como o Recoll, mas normalmente ele dá muito mais discos do que eu preciso. Como minha nomenclatura é bastante consistente, acho que deve haver uma maneira de rotulizá-la usando o comando find.

Embora eu saiba como realizar pesquisas por condições únicas, não sei como encontrar vários critérios / condições. Ou seja, como faço para encontrar todos os arquivos cujos nomes satisfazem certas condições. Vamos considerar os seguintes exemplos que contêm

  1. {2015} E {{album} OU {picture}}
  2. {album} AND {vacation} E NÃO {2015}
por Pierre 10.03.2015 / 09:50

3 respostas

4

Geralmente não vale a pena digitar coisas como

find /dir -regex '.*2015.*\(album.*\|picture.*\)'

não perca tempo, use o conceito grep e UNIX de uma ferramenta para cada tarefa:

find /dir|egrep '2015.*(album|picture)'

Isto é:

  • digite menos - obtenha resultados com mais rapidez
  • mais legível (não \, desnecessário. *)
  • pode ser mais rápido (comandos canalizados significam que o kernel pode equilibrar entre dois processadores, sim eu testei agora mesmo no meu console comum)
  • será o mesmo caso você queira ler a lista de arquivos do arquivo ou de outra fonte
por 10.03.2015 / 12:36
2

para o primeiro

 find DIR \( -name 2015\* -a \( -name \*album\* -o -name \*picture\* \) \) -delete

onde

  • você tem que escapar de * para avoir expansion
  • você tem que escapar (e) para avoir subshell
  • substitua -delete do que você quiser

o segundo é deixado como lição de casa (dica \! )

    
por 10.03.2015 / 10:56
2

Para o primeiro, find com -regex seria bom:

find /dir -regex '.*2015.*\(album.*\|picture.*\)'

Para o segundo que:

find . -name "*album*" -a -name "*vacations*" -a -not -name "*2015*"
    
por 10.03.2015 / 10:57