Best Practice Doppelte und einfach Anführungsstriche in Runtime.getruntime().exec()

noobee

Aktives Mitglied
Hallo community,

ich möchte über die Linux Konsole meine Dateien auslesen und mir das größte File zurück geben lassen. Wenn ich händisch alles in die Konsole eingebe, funktioniert das super. Lass ich das mit Netbeans über ...exec() ausführen, gehts natürlich nicht. Der Fehler liegt mit großer Wahrscheinlichkeit am richtigen Setzen der Quotes.

Händisch in der Konsole: "find /home/Downloads/dir_3 -printf '%s %p\n'| sort -rn | head -1" läufts:
84642841 /home/Downloads/dir_3/distributor_marvel_studios_2016-DWEU.mkv

Meine Versuche:
Java:
Process p2 = Runtime.getRuntime().exec("find /home/Downloads/dir_3/ -printf '%s %p\n' | sort -rn | head -1");
Java:
Process p2 = Runtime.getRuntime().exec(new String[] {"find", "/home/Downloads/dir_3/", "-printf %s %p\n", "| sort -rn | head -1"} );
Java:
Process p2 = Runtime.getRuntime().exec(new String[] {"find", "/home/Downloads/dir_3/", "-printf '%s %p\n'", "| sort -rn | head -1"} );

Alle 3 gehen leider nicht. Kann mir jemand die Quotes setzen? Und weiß jemand zufällig, wie ich statt Dateigröße und Name NUR noch den Name angezeigt bekomme, wenn es dann mal geht?
 
Mal abgesehen davon, dass man hier keinen Prozess braucht und man das mit der Java API auch hinbekommt, schätze ich mal, dass es an \n liegt und es mit \\n escaped werden muss.
 
Java:
import java.io.*;

public class Bash {
    public static void main(String[] args) throws Exception {
        Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", 
                "find . -name '*.java' | grep 'Bash'"});
        try(BufferedReader is = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
            String line;
            while ((line = is.readLine()) != null) {
                System.out.println(line);  
            }
        }
        System.out.println("Exited with " + p.waitFor());
    }
}
 
Noch viel wunderbarerer 😉 geht es plattformunabhängig:

Java:
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.*;

public class LargestFile extends SimpleFileVisitor<Path> {

    private Path largest;
    private long size;

    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
            throws IOException {
        if (Files.isRegularFile(file, LinkOption.NOFOLLOW_LINKS)) {
            long fileSize = Files.size(file);
            if (fileSize > size) {
                size = fileSize;
                largest = file;
            }
        }            
        return FileVisitResult.CONTINUE;
    }

    public Path getPath() { return largest; }
    public long getSize() { return size; }

    public static LargestFile find(Path start) throws IOException {
        LargestFile result = new LargestFile();
        Files.walkFileTree(start, result);
        return result;
    }
   
    public static void main(String[] args) throws Exception {
        LargestFile largest = LargestFile.find(Paths.get(args[0]));

        System.out.printf("%s %d\n", largest.getPath(), largest.getSize());
    }
}

Code:
java -cp . LargestFile /home/Downloads/dir_3/
 

Zurück
Oben