Linuxcc++下ls命令的实现(超详细)
今天我们要讨论的是bash shell的⼀个重要命令,就是“ls”命令。Linux 中的 ls 命令是每个 Linux ⽤户都应该知道的最重要的命令之⼀。如果您是使⽤命令⾏的初学者,ls 可能是您应该尝试学习的第⼀个命令。
ls 是 list 的缩写,⽤于列出当前⼯作⽬录或其他⽬录(如果指定)中的⽂件。
ls命令为什么这么重要
ls 如此重要的原因在于它允许查看⽬录中的⽂件。将经常使⽤它来列出⽬录内容。 ls 不是⼀个复杂的命令,实现起来也很容易,但它确实包含许多不同的选项,可⽤于列出包含附加信息的⽂件。
在这过程中,你可能会发现其中⼀些选项⾮常有⽤,即使 ls 本⾝总是⾜以列出内容。掌握 ls 命令将使你更有效地列出⽬录内容和查⽂件。它也可以在 Bash 脚本中使⽤,以帮助其他⼯具操作⽂件。
最后,我们每天在使⽤linux的时候经常使⽤ ls 命令,但是你了解ls的实现吗?
快速了解ls命令
ls 命令列出⽬录中包含的⽂件和⼦⽬录。 您可以与 ls ⼀起使⽤的选项主要是为了列出附加信息,或者以不同的⽅式格式化输出。
ls -l显⽰⽂件或⽬录、⼤⼩、修改⽇期和时间、⽂件或⽂件夹名称和⽂件所有者及其权限。
其他选项这⾥就不列举出来了,感兴趣的可以通过man⼿册了解。
怎么实现ls命令?
我们已经通过在命令⾏上输⼊ls命令,列出⽬录中包含的⽂件和⼦⽬录。
-a 选项还将列出隐藏⽂件(名称以 . 开头的⽂件)。 除⾮您在根⽬录中,否则它还会列出 . (当前⼯作⽬录)和 … (向上⼀个⽬录)作为⽂件。
那么我们如何读取⽬录、⽂件信息呢?
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
最多常见的readdir使⽤⽅式:
编译运⾏:
上⾯输出是未按照⽂件名排序。#include <stdio.h>#include <dirent.h>#include <string.h>#include <stdio.h>#include <iostream>#include <stdlib.h>using namespace std ;#define FILE_NAME "/opt/code/linux_command_code"int main (int argc , char **argv ){ DIR *dir ; struct dirent *ptr ; dir = opendir (FILE_NAME ); if (NULL == dir ) { cout << "opendir is NULL" << endl ; return -1; } while ( (ptr = readdir (dir ))!=NULL ) { printf ("d_ino :%ld d_off:%ld d_name: %s\n", ptr ->d_ino ,ptr ->d_off ,ptr ->d_name ); } closedir (dir ); return 0;}
1
2
3
4
5
6
linux命令查看文件夹大小7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
readdir函数按照在磁盘的索引顺序,d_off来排序,若是须要按照⽂件名d_name,须要遍历后将⽂件名保存,再次排序。
scandir 的使⽤
函数scandir扫描dir⽬录下以及dir⼦⽬录下满⾜filter过滤模式的⽂件,返回的结果是compare函数经过排序的,并保存在 namelist中。注意namelist是通过malloc动态分配内存的,所以在使⽤时要注意释放内存。alphasort和versionsort 是使⽤到的两种排序的函数。常见scandir的使⽤:int scandir (const char *dir ,struct dirent **namelist ,int (*filter )(const void *b ), int ( * compare )( const
struct dirent **, const struct dirent ** ) );int alphasort (const void *a , const void *b );int versionsort (const void *a , const void *b );
1
2
3
4
编译运⾏:
scandir函数中能够直接调⽤排序函数,将遍历到的⽂件名按照顺序保存在队列中。#include <stdio.h>#include <dirent.h>#include <string.h>#include <stdio.h>#include <iostream>#include <stdlib.h>using namespace std ;#define FILE_NAME "/opt/code/linux_command_code"int main (int argc , char **argv ){ struct dirent **namelist ; int n ; n = scandir (FILE_NAME ,&namelist ,0,alphasort ); if (n < 0) { cout << "scandir return "<< n << endl ; } else { int index =0; while (index < n ) { printf ("d_ino :%ld d_off:%ld d_name: %s\n", namelist [index ]->d_ino ,namelist [index ]->d_off ,namelist [index ]->d_name ); free (namelist [index ]); index ++; } free (namelist ); } return 0;}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
下⾯我们来看看怎么实现ls -l ;
如何实现 ls -l
在 Linux 中与 ls 命令⼀起使⽤的最常⽤选项之⼀是 -l。 此选项以更长的格式列出⽬录内容。上⾯输出向我们显⽰⽬录中所有⽂件的⽂件权限、指向该⽂件的符号链接数量、每个⽂件的所有者和组、上次修改时间等。
下⾯是定义的7个字段。
获得⽂件信息
stat 能获取与⽂件系统及⽂件相关的许多信息,具体⽤途见stat的功能选项。这些信息包括inode、atime、ctime、mtime、⽂件(系统)类型、权限、块⼤⼩、符号连接等。char * getperm (char * , struct stat filestat );int getlinks (struct stat filestat );char * getuser (struct stat filestat );char * getgroup (struct stat filestat );int getsize (struct stat filestat );char * getdate (char * , struct stat filestat );char * getname (char * , char * , char , int );
1
2
3
4
5
6
7
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论