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.txttestDir/file2dir2file3.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")}'

관련 정보