2013-03-24 7 views
8

मैं मुद्रित करने के लिए "* सी" जावा में फ़ाइलोंजावा में "ls * .c" कमांड का उपयोग कैसे करें?

मैं नीचे दिए गए कोड का उपयोग

public static void getFileList(){ 
    try 
    { 
     String lscmd = "ls *.c"; 
     Process p=Runtime.getRuntime().exec(lscmd); 
     p.waitFor(); 
     BufferedReader reader=new BufferedReader(new InputStreamReader(p.getInputStream())); 
     String line=reader.readLine(); 
     while(line!=null) 
     { 
      System.out.println(line); 
      line=reader.readLine(); 
     } 
    } 
    catch(IOException e1) { 
     System.out.println("Pblm found1."); 
    } 
    catch(InterruptedException e2) { 
     System.out.println("Pblm found2."); 
    } 

    System.out.println("finished."); 
} 

पुनश्च कोशिश कर रहा हूँ: - यह "ls" के लिए ठीक काम कर रहा है command.when मैं उपयोग कर रहा हूँ "* "किसी भी आदेश में, सभी काम नहीं कर रहे हैं। जावा में कमांड में "*" के प्रतिस्थापन की आवश्यकता है।

अद्यतन

आपकी मदद के लोगों के लिए धन्यवाद।

अब मुझे जावा में "ls -d1 $ PWD/**" टिप्पणी के लिए एक ही परिणाम की आवश्यकता है। यह पूरे पथ के साथ सभी निर्देशिका नाम सूचीबद्ध करेगा।

आपके समय के लिए धन्यवाद।

+0

कोई विशेष कारण आप 'ls' कमांड के साथ ऐसा करने की आवश्यकता है के बाद से फ़ाइलों की सूची के लिए? –

+1

[** क्या जावा में getRuntime.exec() समझता है * या नहीं? **] (http://stackoverflow.com/questions/11789952/does-getruntime-exec-in-java-understands-or-not) –

+0

हाँ ... मुझे फ़ाइल/निर्देशिका नामों को पूर्ण पथ से प्रिंट करने की आवश्यकता है। इसलिए मैंने इस उदाहरण के साथ प्रयास किया। – RJSV

उत्तर

11

आप इस और अधिक विश्वसनीय हो सकते हैं:

Path dir = Paths.get("/path/to/directory"); 

try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.c")) { 
    for (Path file : stream) { 
     // Do stuff with file 
    } 
} 
+0

+1: जावा 7 के रूप में, 'फ़ाइलें' जाने का रास्ता होना चाहिए। – millimoose

1

* शैल द्वारा विस्तारित किया गया है। तो एक ग्लोब के रूप में फ़ाइल नाम का विस्तार करने के लिए इसका उपयोग करने के लिए, आपको शेल के माध्यम से ls कमांड को कॉल करना होगा, उदा।

String lscmd = " bash -c 'ls *.c' "; 

संपादित

@Stephen से अच्छा बिंदु, कार्यकारी आदेश को विभाजित करने में नाकाम रहने के बारे में: इस तरह। निष्पादित करने के लिए ls -d1 $PWD/* आप इस तरह यह कर सकते हैं:

String lscmd = "ls -d1 $PWD/*"; 
Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", lscmd}); 
-1

मुझे पता है, यह सीधे नहीं आपके प्रश्न के उत्तर है, लेकिन अगर आप कर सकते हैं, निर्देशिका में फ़ाइलों को सूचीबद्ध करने के लिए ओएस स्वतंत्र तरीका पसंद करते हैं।

फायदे हैं - यूनिक्स/लिनक्स विशिष्ट प्रक्रिया को बढ़ाने की आवश्यकता नहीं है (इसकी बहुत महंगा)।

यहाँ आप कैसे जावा में ऐसा करने का एक उदाहरण देख सकते हैं:

List Files in Directory

आशा इस मदद करता है

+0

इसे केवल एक लिंक पोस्ट करने के लिए बुरी आदत माना जाता है (सामग्री जो प्रदान कर सकती है) एक उत्तर। यह या तो टिप्पणी होनी चाहिए, या कोड को उत्तर के शरीर में ओपीएस समस्या के वास्तविक समाधान को शामिल करने के लिए विस्तारित होना चाहिए। – millimoose

1

जावा जिस तरह से एक FilenameFilter उपयोग करने के लिए है। मैं here से एक कोड उदाहरण अनुकूलित:

import java.io.File; 
import java.io.FilenameFilter; 
public class Filter implements FilenameFilter { 

    protected String pattern; 

    public Filter (String str) { 
    pattern = str; 
    } 

    public boolean accept (File dir, String name) { 
    return name.toLowerCase().endsWith(pattern.toLowerCase()); 
    } 

    public static void main (String args[]) { 

    Filter nf = new Filter (".c"); 

    // current directory 
    File dir = new File ("."); 
    String[] strs = dir.list(nf); 

    for (int i = 0; i < strs.length; i++) { 
     System.out.println (strs[i]); 
    } 
    } 
} 

अद्यतन:

अपने अद्यतन के लिए, आप के ऊपर एक new File (".").listFiles(); प्रत्येक फ़ाइल पर पुनरावृति सकता है और जारी file.getAbsolutePath()

1

आप फार्म "बैश -c 'ls * ग' के एक आदेश पर अमल करने की जरूरत है "...क्योंकि जावा exec विधियों को '*' विस्तार (ग्लोबिंग) नहीं समझा जाता है। ,, ("बैश -c" फ़ॉर्म सुनिश्चित करता है कि एक खोल कमांड लाइन पर कार्रवाई करने के लिए किया जाता है।)

हालांकि आप बस Runtime.exec(...) के लिए एक एकल स्ट्रिंग के रूप में उपरोक्त आदेश प्रदान नहीं कर सकते क्योंकि exec भी नहीं समझती उसमें उद्धृत करने वाले असामान्य स्ट्रिंग को विभाजित करने का सही तरीका।

इसलिए, exec प्राप्त करने के लिए सही काम करने के लिए, आप कुछ इस तरह करने की जरूरत है:

String lscmd = "ls *.c"; 
    Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", lscmd}); 

दूसरे शब्दों में, आप हाथ से तर्क बंटवारे करने की ज़रूरत है ...


यह ध्यान दिया जाना चाहिए कि इस उदाहरण को "ग्लोबिंग" करने के लिए FileMatcher का उपयोग करके लागू किया जा सकता है और परिणाम से तर्क सूची एकत्रित किया जा सकता है। लेकिन जटिल है अगर आप ls चलाने के अलावा कुछ और जा रहे हैं ... और आईएमओ जटिलता उचित नहीं है।

+0

यह कुछ हद तक गलत है, जावा में एक ग्लोबिंग कार्यान्वयन मौजूद है: http://docs.oracle.com/javase/tutorial/essential/io/find.html (खोल का उपयोग करना लगातार व्यवहार प्राप्त करने के लिए एक वैध विकल्प है।) – millimoose

+1

@ मिलिमोस - आप सही हैं। अपडेट किया गया। –

1

एक उदाहरण जावा 7.

import java.io.IOException; 
import java.nio.file.DirectoryStream; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
public class Main { 
    public static void main(String[] args) { 
     Path dir = Paths.get("/your/path/"); 
     try { 
      DirectoryStream<Path> ds = Files.newDirectoryStream(dir, "*.{c}"); 
      for (Path entry: ds) { 
       System.out.println(entry); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
संबंधित मुद्दे