Übung 6
Dateisystem, Dateiattribute, Dateisystem-API
Folien ⨳ Aufgabe
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]);
}
}
}