精华内容
下载资源
问答
  • linux 列出目录下所有文件目录

    千次阅读 2015-07-27 20:39:51
    Linux下面列出目录下面的所有目录文件,且支持递归。

    下面的代码是列出指定目录下的所有文件和目录,且支持递归搜索算法。


    #include <sys/types.h>
    #include <sys/stat.h>
    #include <dirent.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <errno.h>
    #include <string.h>
    #include <stdbool.h>
    
    /**
     * List all the files and directories under the specified directory, recursively.
     *
     */
    void list_files(const char* directory, char*** filenames, int* file_count, int* array_size)
    {
        DIR* dir;
        struct dirent* de;
        char file_name[FILENAME_MAX];
        struct stat st;
        
        dir = opendir(directory);
        if (NULL == dir) {
            printf("ERROR: open failed: %s(%s)\n", directory, strerror(errno));
            return;
        }
        
        bool end_with_slash = ('/' == directory[strlen(directory) - 1]);
        bool is_dir;
        while ((de = readdir(dir)) != 0) {
            strcpy(file_name, directory);
            if (!end_with_slash) strcat(file_name, "/");
            strcat(file_name, de->d_name);
            
            printf("de->d_name: %s\n", de->d_name);
            if ('.' == de->d_name[0]) {
                if (0 == de->d_name[1]) continue; // .
                if (('.' == de->d_name[1]) && (0 == de->d_name[2])) continue; // ..
            }
            
            if (stat(file_name, &st) != 0) {
                printf("stat failed: %s, %s\n", file_name, strerror(errno));
                continue;
            }
            
            if ((is_dir = S_ISDIR(st.st_mode)) || S_ISREG(st.st_mode)) {
                if (*file_count > *array_size) {
                    *array_size = (*array_size) * 2;
                    *filenames = (char**)realloc(*filenames, (*array_size) * sizeof(char*));
                }
                
                (*filenames)[(*file_count)++] = strdup(file_name);
                
                if (is_dir) {
                    list_files(file_name, filenames, file_count, array_size);
                }
            } else {
                printf("Other files: %s\n", file_name);
            }
        }
        
        closedir(dir);
    }
    
    static void test(const char* directory)
    {
        char** filenames;
        int file_count = 0;
        int array_size = 16;
        
        filenames = (char**)malloc(array_size * sizeof(char*));
        if (NULL == filenames) {
            printf("No memory.\n");
            return;
        }
        
        list_files(directory, &filenames, &file_count, &array_size);
        
        printf("All files:\n");
        for (int i = 0; i < file_count; i++) {
            printf("%s\n", filenames[i]);
            free(filenames[i]);
            filenames[i] = NULL;
        }
        
        free(filenames);
    }
    
    int main(int argc, const char* argv[])
    {
        if (argc != 2) {
            printf("Usage: %s dir_name\n", argv[0]);
            return 1;
        }
    
        test(argv[1]);
        
        return 0;
    }
    
    
    
    目录结构 示例:
    

    flying-bird@flyingbird:~/examples/cpp/list_files/test$ ll . a/ b/
    .:
    total 24
    drwxrwxr-x 4 flying-bird flying-bird 4096  7月 27 20:31 ./
    drwxrwxr-x 3 flying-bird flying-bird 4096  7月 27 20:31 ../
    drwxrwxr-x 2 flying-bird flying-bird 4096  7月 27 20:31 a/
    drwxrwxr-x 2 flying-bird flying-bird 4096  7月 27 20:31 b/
    -rw-rw-r-- 1 flying-bird flying-bird    6  7月 27 20:31 first.txt
    -rw-rw-r-- 1 flying-bird flying-bird    7  7月 27 20:31 second.txt
    
    a/:
    total 16
    drwxrwxr-x 2 flying-bird flying-bird 4096  7月 27 20:31 ./
    drwxrwxr-x 4 flying-bird flying-bird 4096  7月 27 20:31 ../
    -rw-rw-r-- 1 flying-bird flying-bird    6  7月 27 20:31 first.txt
    -rw-rw-r-- 1 flying-bird flying-bird    7  7月 27 20:31 second.txt
    
    b/:
    total 16
    drwxrwxr-x 2 flying-bird flying-bird 4096  7月 27 20:31 ./
    drwxrwxr-x 4 flying-bird flying-bird 4096  7月 27 20:31 ../
    -rw-rw-r-- 1 flying-bird flying-bird    6  7月 27 20:31 first.txt
    -rw-rw-r-- 1 flying-bird flying-bird    7  7月 27 20:31 second.txt
    flying-bird@flyingbird:~/examples/cpp/list_files/test$ 
    


    再增加一个symlink:

    flying-bird@flyingbird:~/examples/cpp/list_files/test$ ln -s test test
    flying-bird@flyingbird:~/examples/cpp/list_files/test$ ll
    total 24
    drwxrwxr-x 4 flying-bird flying-bird 4096  7月 27 20:43 ./
    drwxrwxr-x 3 flying-bird flying-bird 4096  7月 27 20:38 ../
    drwxrwxr-x 2 flying-bird flying-bird 4096  7月 27 20:31 a/
    drwxrwxr-x 2 flying-bird flying-bird 4096  7月 27 20:31 b/
    -rw-rw-r-- 1 flying-bird flying-bird    6  7月 27 20:31 first.txt
    -rw-rw-r-- 1 flying-bird flying-bird    7  7月 27 20:31 second.txt
    lrwxrwxrwx 1 flying-bird flying-bird    4  7月 27 20:43 test -> test
    flying-bird@flyingbird:~/examples/cpp/list_files/test$


    没有symlink时的运行示例:

    flying-bird@flyingbird:~/examples/cpp/list_files$ ./a.out ./test/
    de->d_name: b
    de->d_name: first.txt
    de->d_name: second.txt
    de->d_name: .
    de->d_name: ..
    de->d_name: first.txt
    de->d_name: second.txt
    de->d_name: .
    de->d_name: ..
    de->d_name: a
    de->d_name: first.txt
    de->d_name: second.txt
    de->d_name: .
    de->d_name: ..
    All files:
    ./test/b
    ./test/b/first.txt
    ./test/b/second.txt
    ./test/first.txt
    ./test/second.txt
    ./test/a
    ./test/a/first.txt
    ./test/a/second.txt
    flying-bird@flyingbird:~/examples/cpp/list_files$ 
    

    增加symlink的运行示例:

    flying-bird@flyingbird:~/examples/cpp/list_files$ ./a.out test/
    de->d_name: b
    de->d_name: first.txt
    de->d_name: second.txt
    de->d_name: .
    de->d_name: ..
    de->d_name: first.txt
    de->d_name: second.txt
    de->d_name: .
    de->d_name: test
    stat failed: test/test, Too many levels of symbolic links
    de->d_name: ..
    de->d_name: a
    de->d_name: first.txt
    de->d_name: second.txt
    de->d_name: .
    de->d_name: ..
    All files:
    test/b
    test/b/first.txt
    test/b/second.txt
    test/first.txt
    test/second.txt
    test/a
    test/a/first.txt
    test/a/second.txt
    flying-bird@flyingbird:~/examples/cpp/list_files$ 
    



    展开全文
  • linux ls列出目录下所有文件数量

    千次阅读 2013-07-01 13:18:16
     ls-lR|grep"^-"|wc-lLinux查看某个目录下文件、或文件夹个数用到3个命令:ls列目录、用grep过虑、再用wc统计。举例说明:... 查看统计当前目录下文件的个数,包括子目录里的。  ls -lR| grep "^-" | wc -l...

    查看统计当前目录下文件的个数,包括子目录里的。  ls-lR|grep"^-"|wc-lLinux下查看某个目录下的文件、或文件夹个数用到3个命令:ls列目录、用grep过虑、再用wc统计。举例说明:...
    查看统计当前目录下文件的个数,包括子目录里的。
      ls -lR| grep "^-" | wc -l[喝小酒的网摘]http://blog.const.net.cn/a/12311.htm


    Linux下查看某个目录下的文件、或文件夹个数用到3个命令:ls列目录、用grep过虑、再用wc统计。
    举例说明:
    1、查看统计当前目录下文件的个数
      ls -l | grep "^-" | wc -l
    2、查看统计当前目录下文件的个数,包括子目录里的。
      ls -lR| grep "^-" | wc -l
    3、查看某目录下文件夹(目录)的个数,包括子目录里的。
      ls -lR| grep "^d" | wc -l


    命令解释:
    ls -l
    长列表输出该目录下文件信息(注意这里的文件,不同于一般的文件,可能是目录、链接、设备文件等),每一行对应一个文件或目录,如果要列出所有子目录下的文件就是ls -lR。
    grep "^-"
    这里将长列表输出信息过滤一部分,只保留一般文件,如果只保留目录就是grep "^d"。
    wc -l
    统计输出信息的行数,因为已经过滤得只剩一般文件了,所以统计结果就是一般文件信息的行数,又由于一行信息对应一个文件,所以也就是文件的个数。





    展开全文
  • linux列出目录下所有目录

    千次阅读 2018-07-30 10:44:00
    我的一个目录下有很多文件,但是我想列出目录下所有目录,并且删除 列出目录下所有目录,常用的方法是ll配合管道命令,比如 ll | grep "^d" 通过对ll命令的输出,抓取第一个字符,来判断是不是文件,如...

    我的一个目录下有很多文件,但是我想列出该目录下所有的目录,并且删除

    列出目录下所有的目录,常用的方法是ll配合管道命令,比如

    ll | grep "^d"

    通过对ll命令的输出,抓取第一个字符,来判断是不是文件,如下图所示

    然而,如果继续管道命令操作,比如我想继续用xargs来删除列出的文件夹,并不可行

     

    鸟哥的linux书上写了,ls -d是列出所有的目录,然而你若是用ls -d来进行操作的时候,输出结果如下

    ok, ls -d ./试一试

    然而鸟哥的linux私房菜这本书上并没有说明

    ls -d

    后面还需要接参数

    正确的打开方式应该是

    ls -d */

    没毛病,配合xargs rm -rf 管道命令就可以删除目录下所有的目录了

    ls -d */ | xargs rm -rf

    没毛病

    展开全文
  • 递归遍历目录列出目录中的文件,代码:#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <dirent.h> #include <sys/types.h>...

    递归遍历目录,列出目录中的文件,代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <dirent.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    
    #define MAX_PATH 512  //最大文件长度定义为512
    
    /*对目录中所有文件执行print_file_info操作*/
    void dirwalk(char *dir, void (*func)(char *))
    {
    	char name[MAX_PATH];
    	struct dirent *dp;
    	DIR *dfd;
    	
    	if((dfd = opendir(dir)) == NULL){
    		fprintf(stderr, "dirwalk: can't open %s\n", dir);
    		return;
    	}
    	
    	while((dp = readdir(dfd)) != NULL){ //读目录记录项
    		if(strcmp(dp->d_name, ".") == 0 || strcmp(dp -> d_name, "..") == 0){
    			continue;  //跳过当前目录以及父目录
    		}
    		
    		if(strlen(dir) + strlen(dp -> d_name) + 2 > sizeof(name)){
    			fprintf(stderr, "dirwalk : name %s %s too long\n", dir, dp->d_name);
    		}else{
    			sprintf(name, "%s/%s", dir, dp->d_name);
    			(*func)(name);
    		}
    	}
    	closedir(dfd);
    }
    
    /*打印文件信息*/
    void print_file_info(char *name)
    {
    	struct stat stbuf;
    	
    	if(stat(name, &stbuf) == -1){
    		fprintf(stderr, "file size: open %s failed\n", name);
    		return;
    	}
    	
    	if((stbuf.st_mode & S_IFMT) == S_IFDIR){ 
    		dirwalk(name, print_file_info);	 //如果是目录遍历下一级目录
    	}else{							
    		printf("%8ld    %s\n", stbuf.st_size, name);//不是目录,打印文件size及name
    	}
    }
    
    int main(int argc, char *argv[])
    {
    	printf("file size    file name\n");
    	if(argc == 1){
    		print_file_info(".");//未加参数执行时,从当前目录开始遍历
    	}else{
    		while(--argc>0){
    			print_file_info(*++argv);
    		}
    	}
    	
    	return 0;
    }
    

    程序运行及执行结果:

    yu@ubuntu:~/Linux/206/dirop$ gcc -o dir dir.c 
    
    yu@ubuntu:~/Linux/206/dirop$ ./dir 
    file size    file name
        7820    ./dir
        1351    ./dir.c
        
    yu@ubuntu:~/Linux/206/dirop$ ./dir /home/yu/Linux/206
    file size    file name
        7560    /home/yu/Linux/206/copy
           0    /home/yu/Linux/206/src
        7820    /home/yu/Linux/206/dir
         487    /home/yu/Linux/206/copy.c
        7516    /home/yu/Linux/206/lseek
        7516    /home/yu/Linux/206/llll/lseek
        1025    /home/yu/Linux/206/llll/x
         348    /home/yu/Linux/206/llll/lseek.c
           0    /home/yu/Linux/206/x
          24    /home/yu/Linux/206/dest
         348    /home/yu/Linux/206/lseek.c
        7820    /home/yu/Linux/206/dirop/dir
        1351    /home/yu/Linux/206/dirop/dir.c
    
    

    这里写图片描述

    展开全文
  • 递归方式列出指定目录下所有目录文件
  • linux下ls 列出所有目录文件

    千次阅读 2014-06-17 13:28:36
    find $PWD | xargs ls -ld *.jar |grep snappy *.jar表示文件的后缀名,可有可无,grep过滤名称里包含snappy的
  • #!/bin/bash function echofile(){ if [[ ! $1 =~ \.log$ ]];then echo $1 fi } function getdir(){ for item in `ls $1` do filename=$1"/"$item if [[...
  • 列出所有目录下的文件/再归的表示文件所有子文件 ls -R 再归的列出所有目录下的文件,并显示详细信息 ls -lR ls -lR是ls -l 与ls -R的结合。 ls -l列出文件的详细信息。 ...
  • 直接贴代码 basepath=$1 findfile(){ dirs=$(ls -l $1 | awk '{print $9}') for dir in $dirs do if test -d "$1/$dir" then findfi...
  • 一循环列出目录下所有文件 #!/bin/bash function frfile() { local basefolder=$1 echo $basefolder #local filename for filename in $(ls $basefolder) do local fullpathfile=$basefolder/$fi
  • 1.linux下递归列出目录下的所有文件名(不包括目录) ls -lR |grep -v ^d|awk '{print $9}' 2.linux下递归列出目录下的所有文件名(不包括目录),并且去掉空行 ls -lR |grep -v ^d|awk '{print $9}' |tr -s '\n' ...
  • Linux下,用C语言实现列出指定目录下的所有文件和文件夹: #include #include #include int main() { DIR *dirp; struct dirent *direntp; dirp = opendir("/
  • ls默认从小到大顺序列出当前目录下所有文件目录。现在的问题是,我只想按照这样的顺序列出指定数目的目录或是文件,那样怎么实现呢? 比如有image目录下有10个子目录image1image2....image10,我直需要列出2个...
  • Linux下可采用readdir ( ) 函数来实现,代码实现过程如下: 打开目录 循环读目录, 输出目录文件 关闭目录指针 #include &lt;dirent.h&gt; #include &lt;stdio.h&gt; int main() { DIR *...
  • linux列出当前目录下所有目录

    千次阅读 2019-06-04 14:09:00
    ### 列出当前目录所有目录: [root@localhost ~]# ls -ld * #列出所有的文件 drwxr-xr-x. 5 root root 44 Nov 28 03:46 elasticsearch drwxr-xr-x 8 root root 134 Apr 2 12:01 elasticsearch-6.7.1 -rw-r...
  • ls -la -R(reverse关键是这个命令)
  • Linux ls命令教程列出文件目录

    千次阅读 2020-10-07 13:55:17
    lsis base command provided by all Linux distributions. We can use lscommand to list files, folders or directories. In this tutorial we will look different use ...ls是所有Linux发行版提供的基本命令。 我...
  • 很多时候我们需要找到某个文件夹包含某个字符串的所有文件,比如已知一个变量名,但是不...目录下所有文件中查找字符串,并且只打印含有该字符串的文件名 find .| xargs grep -ri "class" -l 另一种方法:
  • ls命令是Linux下最常用的命令。ls命令就是list的缩写。缺省下ls用来打印当前目录的清单。如果ls指定其他目录,那么就会显式指定目录里的文件及文件夹清单。...-a 列出目录下的所有文件,包括以 . 开头的隐含文件。 -b
  • Linux tree 命令,以树状列出目录

    千次阅读 2018-10-13 15:27:01
    Linux tree命令,以树状列出目录 之前在一些文章上看到树状展示目录,感觉这个很适合用于项目结构的讲解。后来Google查询,发现Linux系统自带这个命令。就是tree。现在对它的一些使用记录下来,正所谓好记性不如...
  • linux下列当前目录所有目录名称问题 ls -lR |grep -v ^d|awk '{print $9}' |tr -s '\n' 一些其他命令 # 递归查询目录文件个数 ls -d */*|wc -l # 递归查询子文件 ls -lR */*|grep ...
  • Shell是用户与Linux操作系统沟通的... 列出文件 ls -l 然后要统计文件有多少个 grep ‘^d’ 再要统计文件有多少行 wc -l 如果要查很多文件的话,这样反复的敲代码是不是很烦,下面我们就把这些命令放入s
  • ## 只列出常规文件 find ./ -type f   ## 只列出文件夹 find ./ -type d 2 3 4 5 ## 对找到的所有文件进行批处理   find . -type f -exec chmod 644 {} \; # 后面的\;必须的,...
  • linux列出一个目录及其子目录下面的某种类型的文件 作者:smarteng ⁄ 时间:2009年07月09日 ⁄ 分类: Linux命令 ⁄ 评论:0 怎么样把,一个目录及其所有的子目录下面的某种类型(比如*.gif)的文件...
  • linux c++ 遍历目录下所有文件

    千次阅读 2018-05-29 19:58:38
    // 递归列出所有目录文件 void recursion_scan_dir_file(char *dir, int depth) {  DIR *p_dir = NULL;  struct dirent *p_entry = NULL;  struct stat statbuf;  if((p_dir = opendir(dir)) == NULL...
  • 查找目录下所有文件中是否含有某个字符串,并且只打印文件名  find .|xargs grep -ri "IBM" -l  1.正则表达式   (1)正则表达式一般用来描述文本模式的特殊用法,由普通字符(例如字符a-z)以及特殊字符...
  • 最近在整理一些视频和照片时发现,这些文件的命名方式很乱,有的是IMG_20110101.jpg,有的是DISC_20110404.jpg,还有其他的,反正就是很乱,我想整理都不好整理。于是我就冒一个想法,我给它们重命名一下好了,...
  • 列出文件夹 $ ls -F |grep "/$" 或者 # ls -l |grep "^d" drwxr-xr-x 2 root root 4096 2011-05-08 01:46 Desktop drwxr-xr-x 2 root root 4096 2012-03-26 10:03 pic drwxr-xr-x 2 root root 4096 2012-03-30 17...
  • ls命令是linux下最常用的命令。ls命令就是list的缩写,缺省下ls用来打印当前目录的清单。如果ls指定其他目录,那么就会显示指定目录里的文件及文件夹清单。 通过ls 命令不仅可以查看linux文件夹包含的文件而且...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 439,534
精华内容 175,813
关键字:

列出目录下的所有文件linux

linux 订阅