.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 -r
및awk
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
부분, 나머지는 동일합니다).