파일에서 문자열을 검색하고 발견되면 쌍을 이루는 이름을 가진 파일이 동일한 디렉터리에 있는지 확인합니다.

파일에서 문자열을 검색하고 발견되면 쌍을 이루는 이름을 가진 파일이 동일한 디렉터리에 있는지 확인합니다.

.ft1나는 특정 단어를 포함할 수도 있고 포함하지 않을 수도 있는 동일한 결말을 가진 많은 다른 파일을 가지고 있습니다 special. 해당 단어가 포함된 파일에 대해 .log해당 디렉토리에 다른 결말을 가진 다른 파일이 있는지 확인하고 싶습니다 .

내가 지금까지 얻은 것은 다음과 같습니다.

find . -name "*.ft1" -exec grep -l "special" {} \; -execdir ls *log \;

ls그러나 실행할 때마다 오류가 발생합니다.

ls: cannot access *log: No such file or directory

하지만 나는알다이 디렉토리에 그러한 파일이 있습니다. 또한 별표를 이스케이프 처리하여 표현식이 가 되도록 시도했지만 -execdir ls \*log \;오류가 남아 있습니다.

나도 본 적 있어이것비슷한 질문이지만 현재 이것이 내 문제를 해결하는 데 어떻게 도움이 될지 모르겠습니다.

어떻게 하면 제대로 작동하게 할 수 있나요? .log발견된 파일과 이름이 같은 파일 만 나열하는 솔루션에 대한 보너스 포인트입니다 .ft1.

답변1

문제는 glob 을 해석하기 위해 쉘이 필요하다는 것입니다 *.log. 따라서 -execdir쉘을 호출 해야 합니다 . 다음 코드 조각은 "동일 줄기" 요구 사항도 해결합니다.

find . -name "*.ft1" -exec grep -l "special" {} \; \
-execdir bash -c 'x=$1; x=${x%.txt}; ls "$x".log' bash {} \;

답변2

파일 이름에 공백이 없고 공백을 사용할 의도가 없다고 가정하면 find다음과 같이 하면 됩니다.

for file in *.ft1; do
   if grep -q 'special' ${file}; then
      ls -l ${file%.ft1}.log 2> /dev/null
   fi
done

결국 bash 문자열 조작을 사용하게 됩니다 .ft1. 사용할 수 있지만 확장자가 앞에 오는 ${file/ft1/log}모든 파일 이름 과도 일치합니다.ft1

stderr존재하지 않는 파일에 대한 시도를 숨기도록 리디렉션합니다 ls.ls.log

답변3

사용 grep -rawk

grep -rl 'special' *.ft1 | awk '{sub(/\.ft1$/,"");system("sh -c \"[ -f "$0".log ] && echo \\\"["$0".log\\\"] exists for ["$0".ft1]\"")}'

또는 출력ls

grep -rl 'special' *.ft1 | awk '{sub(/\.ft1$/,"");system("sh -c \"[ -f "$0".log ] && ls "$0".log \"")}'

% grep -rl 'special' *.ft1 | awk '{sub(/\.ft1$/,"");system("sh -c \"[ -f "$0".log ] && echo \\\"["$0".log\\\"] exists for ["$0".ft1]\"")}'
[one.log] exists for [one.ft1]

% grep -rl 'special' *.ft1 | awk '{sub(/\.ft1$/,"");system("sh -c \"[ -f "$0".log ] && ls "$0".log \"")}'
one.log

% ls -laog                        
total 100
drwxrwx--x   4  4096 Nov 13 22:03 .
drwxr-xr-x 272 86016 Nov 13 22:03 ..
drwxrwxr-x   2  4096 Nov 13 20:37 bar
drwxrwxr-x   2  4096 Nov 13 20:37 foo
-rw-rw-r--   1     8 Nov 13 21:55 one.ft1
-rw-rw-r--   1     0 Nov 13 21:54 one.log
-rw-rw-r--   1     0 Nov 13 21:54 three.ft1
-rw-rw-r--   1     0 Nov 13 21:54 two.ft1
-rw-rw-r--   1     0 Nov 13 21:54 two.log

% cat one.ft1
special

% cat two.ft1

답변4

대안은 다음 과 같습니다 zsh.

print -rl -- **/*.ft1(.e_'grep -q special $REPLY && REPLY=$REPLY:r.log && [[ -f $REPLY ]]'_)

그러면 .ft1해당 문자열이 포함된 파일을 재귀적으로 검색하여 해당 .log파일만 인쇄합니다. .ft1이 문자열을 포함하는 모든 파일을 인쇄하려는 경우special 그리고해당 .log파일(있는 경우) grep을 .see -q로 바꾸 세요.-l
작동 방식은 다음과 같습니다.(이것은 단서가 있습니다 - grep부분, 나머지는 동일합니다).

관련 정보