Posted on

Übung 6

Dateisystem, Dateiattribute, Dateisystem-API

FolienAufgabe

Beispiel: Symbolische Verknüpfungen finden

Ausgabe aller Dateinamen von symbolischen Verknüpfungen im aktuellen Verzeichnis

#include <stdio.h>
#include <dirent.h>
#include <errno.h>
#include <string.h>
#include <sys/stat.h>


int main(int argc, char **argv) {
    if (argc != 2) {
        fprintf(stderr, "Non enough arguments\n");
        return 1;
    }

    char *dirname = argv[1];

    DIR* dir = opendir(dirname);
    if (!dir) {
        perror("opendir");
        return 1;
    }

    struct dirent *entry;
    while (errno = 0, (entry = readdir(dir)) != NULL) {
        char path[strlen(dirname) + strlen(entry->d_name) + 2];
        strcpy(path, dirname);
        strcat(path, "/");
        strcat(path, entry->d_name);

        struct stat buf;
        if (lstat(path, &buf)) {
            perror("lstat");
            return 1;
        }

        if (S_ISLNK(buf.st_mode)) {
            printf("%s\n", path);
        }
    }
    if (errno) {
        perror("readdir");
        return 1;
    }

    if (closedir(dir) == -1) {
        perror("closedir");
        return 1;
    }
}

Beispiel: Filtern nach Glob-Expressions

Ausgabe aller Übereinstimmungen von beliebig vielen Zeichenketten auf eine Wildcard, wobei beides als Kommandozeilenargumente übergeben werden sollen (./matcher ”*.txt” 1.txt 2.log 3)

#include <stdio.h>
#include <fnmatch.h>

int main(int argc, char **argv) {
    if (argc < 3) {
        fprintf(stderr, "Non enough arguments\n");
        return 1;
    }

    char *pattern = argv[1];

    for (int i = 2; i < argc; i++) {
        if (fnmatch(pattern, argv[i], FNM_PERIOD|FNM_PATHNAME) == 0) {
            printf("%s\n", argv[i]);
        }
    }
}