find: argumento ausente para -exec

1

Os seguintes trabalhos do terminal não apresentam problema

find testDir -type f -exec md5sum {} \;

Onde testDir é um diretório que contém alguns arquivos (por exemplo, file1, file2 e file3).

No entanto, se eu executar isso de um script bash ou de Java usando algo como

Runtime rt = Runtime.getRuntime();
Process pr = rt.exec("find testDir -type f -exec md5sum {} \;");

Eu recebo o seguinte erro

  

find: argumento ausente para '-exec'

Alguma idéia?

ATUALIZAÇÃO: isso foi respondido corretamente no stackoverflow. Eu fecharei a questão aqui. link

    
por Peter Kelly 22.05.2012 / 16:21

2 respostas

4

O \ em -exec md6sum {} \; é necessário para impedir que o shell interprete o caractere ; como separador de comando. Se o Java não executar o comando em um shell, tente remover o escape \ para que o código se torne:

Runtime rt = Runtime.getRuntime();
Process pr = rt.exec("find testDir -type f -exec md5sum {} ;");

Acabei de confirmar este comportamento com o próximo programa de testes:

import java.io.*;
class Xx {
    public static void main(String args[]) throws Exception {
        Process p = Runtime.getRuntime().exec("/bin/echo \;");
        InputStream in = p.getInputStream();
        int c;
        while ((c=in.read()) != -1)
            System.out.write((char)c);
        p.waitFor();
    }
}

Compilado com javac Xx.java , java Xx outputs \; . Se eu remover o \ , ele imprimirá ; conforme o esperado.

    
por Lekensteyn 22.05.2012 / 17:21
0

Diferentes shells às vezes requerem que diferentes caracteres sejam escapados, então dependendo do shell que você está usando em seu terminal e qual shell você está usando para seu script (você diz bash, mas tem certeza?), você pode obter resultados diferentes . Zsh, por exemplo, exigirá que você escape do {} também:

find testDir -type f -exec md5sum \{\} \;

Do Java, você pode tentar remover todas as barras invertidas ou alterar sua segunda linha para:

Process pr = rt.exec("find testDir -type f -exec md5sum \{\} \;");
    
por David Edwards 22.05.2012 / 17:22