2016-04-30 9 views
0

Ich versuche, einen Pfad von der cmd-Zeile zu lesen und dann ls 'cmd auszuführen, um nur die versteckten Dateien und ihre langen Informationen im angegebenen Pfad und dann in eine Textdatei zu drucken. Mein Problem ist, dass 'ls' zurückkehrt:Wie nur versteckte Dateien in einem Verzeichnis mit dem 'ls' cmd drucken?

ls: illegale Option -

ls: illegale Option -.

ls: illegale Option -?

ls: illegale Option - *

Hier ist mein Code:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#include <dirent.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h> 

#define NUMARG 2 


/* start main */ 
    int main(int argc, char *argv[]){ 

/* define data */ 
DIR *dirptr; 
struct dirent *dp; 
int pid; 
    int fd = open("output_file", O_WRONLY|O_CREAT, 0666); 

/* Command Line Check */ 
if(argc != NUMARG){ 
    fprintf(stderr, "usage: %s dirname\n", argv[0]); 
    exit(1); 
    } 

    /* Open the specified directory */ 
if((dirptr = opendir(argv[1])) == NULL){ 
    fprintf(stderr, "Could not open directory %s\n", argv[1]); 
    exit(1); 
    } 

/* fork another process */ 
    switch(pid = fork()){ 

    /* succesfull child process */ 
    case 0: 
     dup2(fd, 1); 
     close(fd); 
     printf("Running ls\n"); 
     execlp("ls", "ls" , "-ld .?*", argv[1], (char*)NULL); 
     perror("execlp"); 
     exit(1); 
     default: 
     sleep(5); 
     printf("Hitting default...\n"); 
     break; 
     case -1: 
     perror("err"); 
     exit(1); 
     } 
    } 
+0

Hallo, Darf ich fragen, warum Sie sich verzweigen? –

+0

Ok, ich habe es nach dem Lesen des Dokuments aus execlp ^^ –

+0

Versucht, die Ausgabe von ls -ld.? * In eine Textdatei zu drucken. –

Antwort

0

haben Sie versuchen, die Argumente wie das Aufspalten:

execlp("ls", "ls" , "-ld", ".?*", argv[1], (char*)NULL); // does not work due to ".?*" has to be expanded by bash 

Verwenden find statt ls:

execlp("find", "find", argv[1], "-maxdepth", "1", "-name", ".?*", (char*)NULL); 
+0

Ja und das funktioniert nicht für mich: .? *: Keine solche Datei oder Verzeichnis –

+0

haben Sie versucht, -a Option hinzuzufügen. Dies wird auch versteckte Dateien auflisten, die '. *' Dateien sind –

+0

@ Totoro ist richtig, die Erweiterung des Platzhalters erfolgt durch Bash, nicht von ls. Eine andere Lösung kann sein, den 'find'-Befehl zu verwenden, der Platzhalter intern unterstützt: find -name'. * ' Beachten Sie, dass' Finnen 'von und all seinen Unterordnern sucht. Die Option -maxdepth kann dies begrenzen ... –

0

Nur ein Hinweis: hier ist eine mögliche Probe - dieser Teil des Codes sollte die Liste der unsichtbaren Dateien aus dem aktuellen Verzeichnis tun ...

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(int argc, char *argv[]) 
{ 
    char s [256] ; 
    strcat(s, "ls -ld .?*"); 
    system(s); 
    return 0; 
} 
2

Run ls durch eine Schale

execlp("/bin/sh", "/bin/sh", "-c", "ls -l .?*", (char *) NULL); 

Auf diese Weise kann Zugriff auf Shell-Platzhalter erhalten.