Linux下ls命令的简单实现



#include <stdio.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <unistd.h>

#include <sys/types.h>

#include <dirent.h>

#include <string.h>

#include <time.h>

#include <pwd.h>

#include <grp.h>

#include <stdlib.h>

void rm(char *pathname) {

struct stat buf;

if (stat(pathname, &buf) == -1) {

printf("path not exist\n");

return;

}

if (S_ISREG(buf.st_mode)) {

unlink(pathname);

printf("remove file:%s\n", pathname);

} else if (S_ISDIR(buf.st_mode)) {

DIR *pdir = opendir(pathname);

struct dirent *pdirent = NULL;

while ((pdirent = readdir(pdir)) != NULL) {

if (strcmp(pdirent->d_name, ".") == 0 || strcmp(pdirent->d_name,

"..") == 0)

continue;

char temp[128] = { ‘\0‘ };

//strcat(temp,pathname);

//strcat(temp,"/");

//strcat(temp,pdirent->d_name);

sprintf(temp, "%s/%s", pathname, pdirent->d_name);

rm(temp);

}

rmdir(pathname);

printf("remove directory:%s\n", pathname);

closedir(pdir);

}

}

void ls_file(char *dirname, char *filename) {

char temp[128] = { ‘\0‘ };

sprintf(temp, "%s/%s", dirname, filename);

char perms[11] = "----------";

struct stat buf;

if (stat(temp, &buf) == -1) {

printf("path not exist\n");

return;

}

switch (buf.st_mode & S_IFMT) {

case S_IFREG:

perms[0] = ‘-‘;

break;

case S_IFDIR:

perms[0] = ‘d‘;

break;

case S_IFLNK:

perms[0] = ‘l‘;

break;

case S_IFBLK:

perms[0] = ‘b‘;

break;

case S_IFCHR:

perms[0] = ‘c‘;

break;

case S_IFSOCK:

perms[0] = ‘s‘;

break;

default:

break;

}

if (buf.st_mode & S_IRUSR)

perms[1] = ‘r‘;

if (buf.st_mode & S_IWUSR)

perms[2] = ‘w‘;

if (buf.st_mode & S_IXUSR)

perms[3] = ‘x‘;

if (buf.st_mode & S_IRGRP)

perms[4] = ‘r‘;

if (buf.st_mode & S_IWGRP)

perms[5] = ‘w‘;

if (buf.st_mode & S_IXGRP)

perms[6] = ‘x‘;

if (buf.st_mode & S_IROTH)

perms[7] = ‘r‘;

if (buf.st_mode & S_IWOTH)

perms[8] = ‘w‘;

if (buf.st_mode & S_IXOTH)

perms[9] = ‘x‘;

struct tm *tm = localtime(&buf.st_mtime);

char file[30] = { ‘\0‘ };

strftime(file, sizeof(file), "%m-%d %H:%M", tm);

printf("%s %2d %s %s %10ld %s %s\n", perms, buf.st_nlink, getpwuid(

buf.st_uid)->pw_name, getgrgid(buf.st_gid)->gr_name, buf.st_size,

file, filename);

}

char* split(char *src,char *right)

{

char *temp = malloc(32);

strcpy(temp,src);

char *p = strrchr(temp,‘/‘);

*p = ‘\0‘;

p++;

strcpy(right,p);

return temp;

}

void ls(char *pathname) {

struct stat buf;

if (stat(pathname, &buf) == -1) {

printf("path not exist\n");

return;

}

if (S_ISREG(buf.st_mode)) {

char name[20]={‘\0‘};

char *temp = split(pathname,name);

ls_file(temp, name);

free(temp);

} else if (S_ISDIR(buf.st_mode)) {

DIR *pdir = opendir(pathname);

struct dirent *pdirent = NULL;

while ((pdirent = readdir(pdir)) != NULL) {

ls_file(pathname, pdirent->d_name);

}

closedir(pdir);

}

}

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

char a[30]="/wepull/a.txt";

char b[30]={‘\0‘};

char *c = split(a,b);

printf("content:%s,%s\n",c,b);

ls("/bak/a.txt");//你的目录名

ls("/bak");

return 0;

}

时间: 2024-10-29 00:48:30

Linux下ls命令的简单实现的相关文章

Linux下ls命令显示符号链接权限为777的探索

Linux下ls命令显示符号链接权限为777的探索 --深入ls.链接.文件系统与权限 一.摘要 ls是Linux和Unix下最常使用的命令之一,主要用来列举目录下的文件信息,-l参数允许查看当前目录下所有可见文件的详细属性,包括文件属性.所有者.文件大小等信息.但是,当其显示符号链接的属性时,无论其指向文件属性如何,都会显示777,即任何人可读可写可执行.本文从ls命令源码出发,由浅入深地分析该现象的原因,简略探究了Linux 4.10下的符号链接链接.文件系统与权限的源码实现. 关键词:Li

linux下常用命令备忘

转自:Linux 命令集锦 linux下查看监听端口对应的进程 # lsof -i:9000 # lsof -Pnl +M -i4 如果退格键变成了:"^h". 终端连接unix删除退格键,按住CTL键同时按delete Linux搜索 # find / -name "xxx.conf" 查看linux是32位还是64位的命令 #file /sbin/init #getconf LONG_BIT #getconf -a 在Linux和Windows下都可以用nslo

图解linux下top命令的使用

top命令经常用来监控linux的系统状况,比如cpu.内存的使用,程序员基本都知道这个命令,但比较奇怪的是能用好它的人却很少,例如top监控视图中内存数值的含义就有不少的曲解. 本文通过一个运行中的WEB服务器的top监控截图,讲述top视图中的各种数据的含义,还包括视图中各进程(任务)的字段的排序. top进入视图 top视图 01 [top视图 01]是刚进入top的基本视图,我们来结合这个视图讲解各个数据的含义. 第一行:10:01:23 当前系统时间126 days, 14:29 系统

Linux 下 Shell 命令的分类及用法

导读 当你打算真正操纵好你的 Linux 系统,没有什么能比命令行界面更让你做到这一点.为了成为一个 Linux 高手,你必须能够理解 Shell命令的不同类型,并且会在终端下正确的使用它们. 在 Linux 下,命令有几种类型,对于一个 Linux 新手来说,知道不同命令的意思才能够高效和准确的使用它们.因此,在这篇文章里,我们将会遍及各种不同分类的 Linux Shell 命令.需要注意一件非常重要的事:命令行界面和 Shell 是不同的,命令行界面只是为你提供一个访问 Shell 的方式.

(转)Linux下PS命令详解

(转)Linux下PS命令详解 整理自:http://blog.chinaunix.net/space.php?uid=20564848&do=blog&id=74654 要对系统中进程进行监测控制,查看状态,内存,CPU的使用情况,使用命令:/bin/ps (1) ps :是显示瞬间进程的状态,并不动态连续: (2) top:如果想对进程运行时间监控,应该用 top 命令: (3) kill 用于杀死进程或者给进程发送信号: (4) 查看文章最后的man手册,可以查看ps的每项输出的含义

Linux下more命令C语言实现实践

1. more第一版 实现基础功能,显示每一页固定24行文本,"q Enter"退出, "Enter" 下一行, "space Enter"下一页. /************************************************************************* > File Name: more01.c > Author: qianlv > Mail: [email protected] &

Linux下chkconfig命令详解

Linux下chkconfig命令详解 chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法:chkconfig [--add][--del][--list][系统服务] 或 chkconfig [--level <等级代号>][系统服务][on/off/reset] chkconfig在没有参数运行时,显示用法.如果加上服务名,那么就检查这个服务是否在当前运行级启动.如果是,返

转载的 Linux下chkconfig命令详解

Linux下chkconfig命令详解 chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法: chkconfig [--add][--del][--list][系统服务] 或 chkconfig [--level <等级代号>][系统服务][on/off/reset] chkconfig 在没有参数运行时,显示用法.如果加上服务名,那么就检查这个服务是否在当前运行级启动.如果是

linux下find命令的使用

find find命令是我们常用的查找文件的命令,它是一个非常强大的查找指令,但相对话费的时间会很长,并且非常消耗资源. 语法: find [路径] [参数] [表达式] [-exec -ok ...] 指令 {} \; {}     代表find找到的文件: \      禁止转义: {}  \; 之间是有空格的: ;      表示本指令结束 -exec  find命令对匹配的文件执行该参数所给出的shell命令: -ok    和-exec的作用相同,只不过是一种更为安全的模式来执行该参数