我编写了一个可执行文件,我想对目录中包含的所有文件执行该可执行文件。
该程序如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/xattr.h>
#include <string.h>
#include <errno.h>
int main(int argc, char const *argv[]){
char argNormaux[4096] = {0};
char argNeg[4096] = {0};
char argEt[4096] = {0};
int nbArgsNormaux = 0;
if (argc > 2){
for (int i = 2; i < argc; i++){
const char *arg = argv[i];
if (strstr(argv[i],"et") != NULL){
strcat(argEt, argv[i]);
}
else if (strstr(argv[i], "!") != NULL){
strcat(argNeg, argv[i]);
}
else {
strcat(argNormaux, argv[i]);
nbArgsNormaux++;
}
}
const char *path = argv[1];
char buf[4096];
int rc;
rc = listxattr(path, buf, sizeof(buf));
if (rc < 0){
perror("listxattr");
}
else {
if (strlen(buf) == 0){
printf("No tag.\n");
return 1;
}
int tagsNormauxCheck = 0;
int tagsNegCheck = 0;
char *token = buf;
while(*token){
char tagBuf[4096];
if (strlen(token) == 2){
if (strcmp(token, "\0\0\0")) break;
}
rc = getxattr(path, token, &tagBuf, sizeof(tagBuf));
if (rc < 0){
perror("getxattr");
}
else {
if (strstr(argNormaux, tagBuf) != NULL) {
tagsNormauxCheck++;
}
if (strstr(argNeg, tagBuf) != NULL) {
tagsNegCheck = 1;
break;
}
}
memset(&tagBuf, 0, sizeof(tagBuf));
token = strchr(token, '\0');
token++;
}
if (tagsNormauxCheck == nbArgsNormaux && tagsNegCheck == 0){
printf("Le fichier %s possède la combinaison des tags donnés.", path);
}
}
}
else {
printf("Pas assez d'arguments.");
}
return 0;
}
这是我尝试使用的命令行:
find . -type f -exec ./logic testDir/ essai '{}' \;
我期望的是将logic
可执行文件应用于该目录中的每个文件testDir
,但它所做的是直接将其应用于testDir
该目录中的每个文件,这不是我想要的......我一直在试图让它工作几天,这很烦人,logic
当应用于单个文件时工作得很好。所以我不知道我应该做什么来实现我想要的。应用的文件参数logic
不会随该命令而改变。
编辑:添加更多关于我想要实现的目标、目的logic
以及我希望它如何工作的背景信息。
logic
是一个程序,显示文件是否具有传递给 的扩展参数的组合logic
。单独执行的一个例子logic
是:logic testfile.txt programming class university \!art
。所以基本上:告诉我是否testfile.txt
有标签的组合programming and class and university and not art
。
现在假设我有一个目录,例如:
testDir/
├── dir2
│ ├── dir2file1.txt
│ ├── dir2file2.txt
│ └── dir2file3.txt
├── file1.txt
├── file2.txt
├── file3.txt
└── file4.txt
1 directory, 7 files
我想logic
对该目录树中存在的每个文件执行。 (不包括文件夹)
所以基本上,我的问题是logic
使用时传递给的文件参数find
没有改变。它会留下来testDir/
,但我希望它一直testDir/file1.txt
这样testDir/file2
,直到它到达dir2file3.txt
。
无论如何要让它发挥作用吗?
谢谢。
答案1
看起来您希望文件路径是第一的你的程序的参数:
find testDir -type f -exec ./logic {} essai \;
这将在目录testDir
(以及 的任何子目录testDir
)中搜索常规文件,并且对于每个找到的文件,它将使用文件的路径名作为第一个参数(并作为essai
第二个参数)来调用您的程序。
这和你自己的命令之间的区别,
find . -type f -exec ./logic testDir/ essai '{}' \;
就是它
- 找到的文件的路径名作为最后的命令行参数,
- 第一个参数始终
testdir/
是 - 您搜索的是当前的目录(及其子目录)。
答案2
这可以做你正在寻找的事情 -
find testDir/ -type f | awk '{system("./logic "$1" -your_args_here")}'