디렉터리에 포함된 모든 파일에 대해 실행하려는 실행 파일을 작성했습니다.
프로그램은 다음과 같습니다:
#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")}'