打印出目录下所有文件名(给出 C、Bash两个版本)

bash

function fl () {
    if [[ -z "$1" ]]; then
        fl_read_dir $PWD
    elif [[ "${1: -1}" == '/' ]]; then
        fl ${1%/}
    else
        fl_read_dir $1
    fi
}

function fl_read_dir () {
    for file in `ls -a $1`; do
        if [ -d $1"/"$file ]; then
            if [[ $file != '.' && $file != '..' ]]; then
                fl_read_dir $1"/"$file
            fi
        else
            echo $1"/"$file
        fi
    done
}

C

#include <dirent.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

void do_ls (char *);

int main (int argc, char *argv[]) {
    if (argc == 1)
        do_ls ("."); // 打开当前目录
    else
        for (int i = 1; i < argc; i++)
            do_ls (argv[i]);
}
void do_ls (char *dirname) {
    if (dirname[strlen (dirname) - 1] == '/')
        dirname[strlen (dirname) - 1] = '\0';
    struct dirent *direntp;
    DIR *dir_ptr = opendir (dirname);
    if (dir_ptr == NULL) {
        fprintf (stderr, "can not open %s", dirname);
    } else {
        while (direntp = readdir (dir_ptr), direntp != NULL)
            if (direntp->d_type == DT_DIR) {
                if (strcmp (direntp->d_name, ".") &&
                    strcmp (direntp->d_name, "..")) {
                    char *tmp_dir = (char *) malloc (
                        strlen (dirname) + strlen (direntp->d_name) + 1 + 1);
                    strcpy (tmp_dir, dirname);
                    strcat (tmp_dir, "/");
                    strcat (tmp_dir, direntp->d_name);
                    do_ls (tmp_dir);
                    free (tmp_dir);
                }
            } else
                printf ("%s/%s\n", dirname, direntp->d_name);
        closedir (dir_ptr);
    }
}

posted on   acd407  阅读(34)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!

导航

< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5
点击右上角即可分享
微信分享提示