如何使用 find 对目录中包含的每个文件递归执行程序

如何使用 find 对目录中包含的每个文件递归执行程序

我编写了一个可执行文件,我想对目录中包含的所有文件执行该可执行文件。

该程序如下所示:

#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 '{}' \;

就是它

  1. 找到的文件的路径名作为最后的命令行参数,
  2. 第一个参数始终testdir/
  3. 您搜索的是当前的目录(及其子目录)。

答案2

这可以做你正在寻找的事情 -

find testDir/ -type f | awk '{system("./logic "$1" -your_args_here")}'

相关内容