2016-04-30 6 views
0

Я пытаюсь прочитать путь из строки cmd, а затем запустить cmd ls для печати только скрытых файлов и их длинной информации в указанном пути, а затем в текстовый файл. Моя проблема заключается в том, что возвращает 'LS':Как печатать только скрытые файлы в каталоге, используя 'ls' cmd?

LS: нелегальный вариант -

LS: нелегальный вариант -.

ls: незаконный вариант -?

лс нелегальный вариант - *

Вот мой код:

#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

Привет, Могу ли я спросить, почему вы используете forking? –

+0

Хорошо, я получил его после чтения документа из execlp ^^ –

+0

Пытается распечатать вывод ls -ld.? * В текстовый файл. –

ответ

0

пытались ли вы разделив арг так:

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

Использование find вместо LS:

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

Да и это не работает для меня: .? *: Нет такого файла или каталога –

+0

Вы попробовали добавить -a вариант. В этом также будут перечислены скрытые файлы, в которых «. *» Находятся файлы –

+0

@totoro прав, расширение подстановки выполняется bash, а не ls. Другим решением может быть использование «find» cmd, который поддерживает внешний вид внутри: find -name '. *' Имейте в виду, что «fins» выполняет поиск с и всех его подпапок. Опция -maxdepth может ограничить это ... –

0

Только намек: вот один возможный пример - это часть кода должна сделать список невидимых файлов из текущего каталога ...

#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

ls Выполнить через оболочку

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

Таким образом, вы получить доступ к групповым символам оболочки.

 Смежные вопросы

  • Нет связанных вопросов^_^