linux下实现简易ll命令

/*
    实现ll命令,输出指定目录下详细信息
    格式:ll -l dirname
    目录采用快速排序,按字典顺序排序
*/
#include <stdio.h>
#include <dirent.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <string.h>
#include <time.h>
#include <grp.h>
#include <pwd.h>
#define NUMLINE 40
#define NUMCHAR 20

/*
    生成屏蔽字
*/
void mode_to_letters(int mode, char str[])
{
    strcpy(str, "----------");
    if (S_ISDIR(mode)) str[0] = ‘d‘;
    if (S_ISCHR(mode)) str[0] = ‘c‘;
    if (S_ISBLK(mode)) str[0] = ‘b‘;
    
    if (mode & S_IRUSR) str[1] = ‘r‘;
    if (mode & S_IWUSR) str[2] = ‘w‘;
    if (mode & S_IXUSR) str[3] = ‘x‘;
    
    if (mode & S_IRGRP) str[4] = ‘r‘;
    if (mode & S_IWGRP) str[5] = ‘w‘;
    if (mode & S_IXGRP) str[6] = ‘x‘;
    
    if (mode & S_IROTH) str[7] = ‘r‘;
    if (mode & S_IWOTH) str[8] = ‘w‘;
    if (mode & S_IXOTH) str[9] = ‘x‘;
    
    str[10] = ‘\0‘;

}
/*
    字符串交换
*/
void exchange(char *s1, char *s2)
{
    char buf[20];
    strcpy(buf, s1);    
    strcpy(s1, s2);
    strcpy(s2, buf);
}
/*
    字符串排序
*/
void sort(char filename[][NUMCHAR], int beg, int end)
{
    int n = beg + 1;
    int m = end;
    if (beg >= end)
        return;
    while ( n < m)
        if (strcmp(filename[n], filename[beg]) > 0) 
            while (n < m)
                if (filename[m] < filename[beg]) {
                    exchange(filename[m--], filename[n++]);
                    break;
                }
                else
                    m--;
        else 
            n++;
    if (strcmp(filename[n], filename[beg]) > 0)
        exchange(filename[--n], filename[beg]);
    else
        exchange(filename[n], filename[beg]);
    sort(filename, 0, n-1);
    sort(filename, n+1, end);
}
/*
    通过getpwuid函数,由用户id获得用户名
*/
char* get_username(uid_t uid)
{
    struct passwd *ptr;
    if ((ptr=getpwuid(uid)) == NULL){
        fprintf(stderr, "get username error");
        exit(1);
    }
    return ptr->pw_name;
}
/*
    由组id获得组名
*/
char* get_groupname(gid_t gid)
{
    struct group *ptr;
    if ((ptr = getgrgid(gid)) == NULL) {
        fprintf(stderr, "get groupname error");
        exit(1);
    }
    return ptr->gr_name;
}
/*
    时间格式转换
*/
void timetrans(time_t *tim, char* s)
{
    struct tm *temp;
    temp = localtime(tim);
    strftime(s, 20, "%m %e %R", temp);
}

int main(int argc, char* argv[])
{
    DIR* dr;
    struct dirent* dir;
    char filename[NUMLINE][NUMCHAR];
    struct stat buf;
    int n, m, p;
    char s1[11];
    char tim[20];
    struct tm *temp;
    if (argc < 3) {
        fprintf(stderr, "ls02:missing operand");
        exit(1);
    }
    if (strcmp(argv[1], "-l")) {
        fprintf(stderr, "ls02: operand:%s is wrong", argv[1]);
        exit(1);
    }
    dr = opendir(argv[2]);
    if (dr == NULL) {
        perror(argv[2]);
        exit(1);
    }
    m = 0;
    while ((dir = readdir(dr)) != NULL) { 
        if (strcpy(filename[m], argv[2]) == NULL) {
            perror("strcpy error");
            exit(1);
        }
        strcpy(filename[m], argv[2]);
        p = 0;
        while(filename[m][p++] != ‘\0‘) ;
        strcpy(&filename[m][p-1], dir->d_name);
        m++;
    }
    sort(filename, 0, --m);
    for (n = 0;n <= m;n++) 
        if (stat(filename[n], &buf) == -1)
            printf("stat error\n");
        else {
            mode_to_letters(buf.st_mode, s1);
            timetrans(&buf.st_mtime, tim);
            printf("%s %4d %s ", s1, buf.st_nlink, get_username(buf.st_uid));
            printf("%s %7d %s %s\n", get_groupname(buf.st_gid), (int)buf.st_size, tim, &filename[n][p-1]);
        }
    
    closedir(dr);
}

总结:

在快速排序处耽误了时间

二维数组做函数形参,第2维不能为空

/*
    ls命令
    格式: ls dirname
*/
#include <stdio.h>
#include <dirent.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
    DIR* dr;
    struct dirent* dir;
    if (argc == 1) {
        fprintf(stderr, "ls01:missing operand");
        exit(1);
    }
    dr = opendir(argv[1]);
    if (dr == NULL) {
        perror(argv[1]);
        exit(1);
    }
    while ((dir = readdir(dr)) != NULL)
        //if (dir->d_name[0] != ‘.‘)
            printf("%s ", dir->d_name);
    printf("\n");
    closedir(dr);
}
时间: 2024-08-05 02:32:18

linux下实现简易ll命令的相关文章

linux下实现简易pwd命令

/*     pwd 命令     路径名通过栈存储,先入栈存储,再出栈输出 */ #include <stdio.h> #include <string.h> #include <unistd.h> #include <dirent.h> #include <string.h> #include <stdlib.h> #define NUM 40 /*     定义节点 */ struct node {     char name[

linux下oralcle11g使用edit命令默认调用vi编辑器

linux下oralcle11g使用edit命令默认调用vi编辑器: 在        $ORACLE_HOME/sqlplus/admin/glogin.sql   最后一行添加   define_editor=vi  即可. linux下oralcle11g使用edit命令默认调用vi编辑器,布布扣,bubuko.com

Linux下静态路由配置命令

linux下静态路由修改命令 方法一: 添加路由 route add -net 192.168.1.0/24 gw 192.168.1.1 route add -host 192.168.1.8 dev 192.168.1.1 删除路由 route del -net 192.168.0.0/24 gw 192.168.0.1 add 增加路由 del 删除路由 -net 设置到某个网段的路由 -host 设置到某台主机的路由 gw 出口网关 IP地址 dev 出口网关 物理设备名 增加默认路由

Linux下那些奇葩的命令

相信喜爱编程,痴迷技术的你,肯定接触过甚至深爱着linux,甚至可能已经非常熟悉linux了,但是linux那逗比的一面,你又知道多少. 本文!纯粹娱乐!不喜勿喷! 1.程序员的愤怒! yes 当我们再终端输入yes命令,你就回看到愤怒地y怒刷屏! 2.小火车sl 我相信ls你每天输入无数次,但是sl你又知道不知道? 我们需要安装一下 sudo yum install sl ubuntu用户: sudo apt-get install sl 之后,再输入sl命令,哈哈,看到小火车没有! 3.无聊

实现Linux下的ls -l命令

基本实现了Linux下的ls -l命令,对于不同的文件显示不同的颜色和显示符号链接暂时没有实现: 1 /************************************************************************* 2 > File Name: dirwalk.c 3 > Author: 4 > Mail: 5 > Created Time: Tue 31 Mar 2015 11:56:38 AM CST 6 ******************

linux下的性能查询命令

(1)查看各个CPU核的使用情况 sudo top -d 1 进入之后,按1,会出现下面的CPU使用情况,其中us列反映了各个CPU核的使用情况,百分比大说明该核在进行紧张的任务. (2)查看哪个进程在哪个CPU核上运行 sudo top -d 1 进入之后,依次按f.j和空格,会出现如下(其中P列指示的是该进程最近使用的CPU核,如进程mencoder的P列为7,则表示mencoder最近在核7上运行,对于多线程甚至单线程的进程,在不同时刻会使用不同的CPU Core): (3)vmstat查

Linux下的目录创建命令使用实践

[文章摘要] 本文以实际的C源程序为例子,介绍了Linux下的目录创建命令(mkdir)的使用方法,为相关开发工作的开展提供了有益的参考. [关键词] C语言  Linux  目录创建  makefile  开发 一.mkdir命令简介 mkdir命令用来创建指定名称的目录,其命令格式为:mkdir [选项] 目录... 其中,[选项]可以是"-m"."-p"或"-v".此外,目录名是区分大小写的. 二.本程序流程 本文中的程序用于实现创建目录的

Linux下vi替换字符命令操作实例

在Linux下的开发中,经常涉及到对文件里的字符进行处理,当中,对字符的替换操作也是非常的频繁. 本文以一个实际的文件为例,具体介绍了Linux下经常使用的vi替换字符命令,为相关的开发工作提供给了參考. 本文中被操作的文件为TestFile.txt,当中的内容例如以下: [email protected]:~/zhouzx/Test> cat TestFile.txt 12345678907890 ABCDABCDEFGHIJ 12345^&*()() 98765432103210 abc

二十七、Linux下常用的shell命令记录

本文章记录我在linux系统下常用或有用的系统级命令,包括软硬件查看.修改命令,有CPU.内存.硬盘.网络.系统管理等命令.但本文不打算介绍生僻命令,也不介绍各个linux发行版下的特有命令,且以后会持续更新. 说明,我是在一个Centos 6.4 64位的虚拟机系统进行测试.本文介绍的命令都会在此Centos下运行验证(也有部分命令会在我的suse/ubuntu系统里测试的,会做特明说明),但运行结果就不再列出了. 硬件篇 CPU相关 lscpu #查看的是cpu的统计信息. cat /pro