Exécuter une commande grep en utilisant java Runtime api

J’ai besoin de grep du texte à l’intérieur d’une liste de fichiers (le nombre de fichiers est énorme) sur le serveur unix, puis lister le nom du fichier dans une interface Web. Donc, j’ai décidé que le meilleur moyen d’y parvenir était d’écrire une commande unix executer en utilisant Runtime.getRuntime (). Fonctionne bien pour la plupart de la commande unix mais fait face à cet étrange problème de grep.

Tout d’abord le code:

public class UnixCommandExecutor { private static SsortingngBuffer output = new SsortingngBuffer(); public static Ssortingng exec(Ssortingng command) throws Exception{ Process process = null; process = Runtime.getRuntime().exec(command); BufferedReader stdErr = getBufferedReader(process.getErrorStream()); BufferedReader stdIn = getBufferedReader(process.getInputStream()); SsortingngBuffer data = extractData(stdErr); if (data.length() >= 1) { System.out.println("Error: " +data.toSsortingng()); throw new Exception(data.toSsortingng()); } data = extractData(stdIn); if (data.length() >= 1) { output = data; System.out.println("Output: " +data.toSsortingng()); } return output.toSsortingng(); } private static BufferedReader getBufferedReader(InputStream stream) { InputStreamReader inReader = new InputStreamReader(stream); BufferedReader buffReader = new BufferedReader(inReader); return buffReader; } private static SsortingngBuffer extractData(BufferedReader reader) throws IOException { SsortingngBuffer data = new SsortingngBuffer(); Ssortingng s = ""; while ((s = reader.readLine()) != null) { data.append(s + "\n"); } return data; } public SsortingngBuffer getOutput() { return output; } } 

Maintenant, l’appel serait quelque chose comme ceci: Ssortingng output = exec (“find. -Name blah”); Cela fonctionne bien et le résultat est parfait. Ou toute autre commande Unix s’exécute et fournit le résultat correctement.

Mais quand la commande grep est utilisée, cela donne une erreur étrange: Ssortingng output = exec (“grep -l executor *”);

Error: grep: *: No such file or directory

C’est étrange, car si je lance cette commande directement sous Unix, cela donne le résultat souhaité. Aussi essayé de donner au chemin de fichier quelque chose comme, Ssortingng output = exec (“grep -l executor / fichier / chemin / *”); même alors l’erreur est:

Error: grep: /file/path/*: No such file or directory

Des idées? ou une autre meilleure façon de résoudre ce problème? Toute suggestion est la bienvenue.

Le * est interprété par le shell, pas grep lui-même. Donc, cela ne fonctionne pas si vous lancez grep depuis votre programme Java.

Vous pouvez utiliser grep avec -r pour le faire récursivement, puis l’utiliser . pour le répertoire actuel:

 grep -lr executor . 

Pour simuler le comportement du shell, remplacez * par une liste de tous les fichiers du dossier dans lequel vous souhaitez effectuer une recherche. Vous pouvez obtenir la liste de tous les fichiers avec:

 SsortingngBuilder str = new SsortingngBuilder(); for (File f : new File("your folder").listFiles()) { if (f.isFile()) { str.append(' ').append(f.getPath()); } } 

Maintenant, remplacez simplement le * par le résultat de str.toSsortingng() .