-
Notifications
You must be signed in to change notification settings - Fork 0
/
cmd2ext.c
57 lines (50 loc) · 1.6 KB
/
cmd2ext.c
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/* This used to be called filtyex ... base don a memonic about filtering by extension
* It's not likely to be useful normally, and covers the edge case of a directory
* which has a huge number of files of a certain extension type, and allows a command
* to be executed on them. Because of this, I've renamed it cmd2ext, i.e. command to extension.
*
* Beware that it requires a parameter file with three lines:
* .
* c
* ls -l
* this will execute a ls -l on all files with the .c extension.
*/
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#include <errno.h>
#include <sys/param.h>
#define SBZ 256 /* standard char buffer size */
int main(int argc, char *argv[])
{
DIR *dirp;
struct dirent *direntp;
if(argc != 2) {
fprintf( stderr, "Usage: %s paramfilename\n", argv[0]);
exit(1);
}
char prms[3][SBZ]={{0}, {0}, {0}};
FILE *fptr=fopen(argv[1], "r");
fscanf(fptr, "%s\n%s\n%[^\t\n]", prms[0], prms[1], prms[2]);
fclose(fptr);
if ((dirp = opendir(prms[0])) == NULL) {
perror(prms[0]);
exit(2);
}
char *ppoi=NULL;
short extsz=strlen(prms[1]);
char cmdstrng[SBZ*2]={0};
while ((direntp = readdir(dirp)) != NULL)
if(direntp->d_type == DT_REG) {
if( (ppoi=strrchr(direntp->d_name, '.')) != NULL)
if(strncmp((ppoi+1), prms[1], extsz)==0) {
sprintf(cmdstrng, "%s %s/%s", prms[2], prms[0], direntp->d_name);
system(cmdstrng);
}
}
closedir(dirp);
return 0;
}