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
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欢乐颂2谢童唱的歌
28
29
30
31
32
33
34
2022延迟退休表格
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