Por que pode -executar a saída do find no Linux?

3

Se eu executar este comando ...

sudo find /storage -name "*~" -or -name ".*~" -or -name "#.*#"
-or -name ".DS_Store" -or -name "Thumbs.db"

... me fornece uma lista de arquivos correspondentes, como esperado. No entanto, se eu usar este comando ...

sudo find /storage -name "*~" -or -name ".*~" -or -name "#.*#"
-or -name ".DS_Store" -or -name "Thumbs.db" -exec rm -v {} \;

... nada é apagado. Da mesma forma, com eco, nada é impresso ...

sudo find /storage -name "*~" -or -name ".*~" -or -name "#.*#"
-or -name ".DS_Store" -or -name "Thumbs.db" -exec echo {} \;

Como assim?

    
por Nick Bolton 12.01.2010 / 22:48

2 respostas

2

Você precisa agrupar sua expressão corretamente - atualmente, o -exec se aplica somente à última ramificação -or .

sudo find /storage \( -name "*~" -or -name ".*~" -or -name "#.*#" -or -name ".DS_Store" -or -name "Thumbs.db" \) -exec rm -v {} \;

Lembre-se de que -exec é apenas uma expressão que retorna true se o comando retornar zero, portanto, executar o comando é apenas um efeito colateral.

    
por 12.01.2010 / 23:12
0
find Documents/ -iname '*.txt' -exec echo {} \;
 -or -iname '*.cpp' -exec echo {} \;

Isso, no entanto, funciona. Espero que isso possa ajudá-lo um pouco mais. Se você usar exec separadamente com todos - ou o comando funcionará.

Eu encontrei uma alternativa para o seu problema.

for file in $(find Documents/ -iname '*.txt' 
-or -iname '*.cpp'| awk '{print $1}'); do rm $file; done
    
por 12.01.2010 / 22:56