리눅스 ls -l 정렬하기
글쓴이: rlaguddls10 / 작성시간: 화, 2019/04/09 - 12:02오전
안녕하세요 리눅스를 공부하다가 궁금한게 생겨서 질문해봅니다.
파일의 정보를 출력해 주는 ls -l 커맨드를 구현해보았는데요.
ls -l의 기능은 정상적으로 수행되는데 여기서 파일의 이름이 알파벳순으로 정렬되도록 하려면 어떻게 수정해야할까요??
구조체를 사용해서 해보려고 했는데 타입이 자꾸 안 맞네요ㅠ
#include<stdio.h> #include<stdlib.h> #include<sys/stat.h> #include<sys/types.h> #include<dirent.h> #include<unistd.h> #include<pwd.h> #include<grp.h> #include<time.h> int main(int argc,char *argv[]) { DIR *nowdir; struct dirent *redir; struct stat st; struct passwd *file_own; struct group *file_grp; struct tm *tm_ptr; char prlist[11]; int i; mode_t modes; if(argc==2){ if((nowdir=opendir(argv[1]))==NULL){ perror("Directory Open ERROR"); exit(1); } } else if((nowdir=opendir("."))==NULL){ perror("Diretory Open ERROR"); exit(1); } while((redir=readdir(nowdir))!=NULL) { for(i=0;i<10;i++) prlist[i]='-'; prlist[10]='\0'; stat(redir->d_name,&st); modes=st.st_mode; if(S_ISDIR(modes)) prlist[0]='d'; if(modes & S_IRUSR) prlist[1]='r'; if(modes & S_IWUSR) prlist[2]='w'; if(modes & S_IXUSR) prlist[3]='x'; if(modes & 0040) prlist[4]='r'; if(modes & 0020) prlist[5]='w'; if(modes & 0010) prlist[6]='x'; if(modes & 0004) prlist[7]='r'; if(modes & 0002) prlist[8]='w'; if(modes & 0001) prlist[9]='x'; file_own=getpwuid(st.st_uid); file_grp=getgrgid(st.st_gid); tm_ptr=gmtime(&st.st_mtime); printf("%s %2d %5s %5s %5d %d-%02d-%02d %d:%02d %-05s\n" ,prlist,st.st_nlink,file_own->pw_name,file_grp->gr_name,st.st_size ,tm_ptr->tm_year+1900,tm_ptr->tm_mon,tm_ptr->tm_mday,tm_ptr->tm_hour+9,tm_ptr->tm_min ,redir->d_name); } }
Forums:
먼저 전체 파일 리스트를 읽어 배열에 담아,
먼저 전체 파일 리스트를 읽어 배열에 담아,
sort 해서 출력하면 될꺼 같네요
참고로 현재 올리신 소스는 디렉토리에 파일이 10개 이상일 때 오류 발생합니다.
scandir()을 구현하는 방법에 대한 질문인가요,
scandir()을 구현하는 방법에 대한 질문인가요, 아니면 scandir() 을 이용하는 방법에 대한 질문인가요.
첫번째 댓글이 달린 다음에 본문이 수정됐군요.
답글입니다
구현하는 쪽이 맞을 것 같습니다
정렬함수 라이브러리를 사용하는게 아니라 파일 이름들을 버블소트를 이용해서 정렬하여 출력할 생각이라서요
댓글 달기