특정 파일 확장자를 검색하여 디렉토리 정렬

특정 파일 확장자를 검색하여 디렉토리 정렬

내가 디렉터리 A에 있다고 가정합니다. A 아래에는 많은 폴더(B, C, D 등)가 있고 각 폴더에는 "*.out" 파일과 하위 폴더가 있습니다. *.out 파일에서 "index123" 텍스트를 찾고 해당 폴더 이름을 모두 인쇄하는 스크립트를 A에서 실행하고 싶습니다.

이것은 내 스크립트입니다.

#!/bin/sh  
FILES=home/A  
grep --include=\*.out -rnw $FILES -e "index123" | while read file; do  
str1="FILES/$(basename $file)"  
echo $str1
done

오류가 표시됩니다.

참고: 코드 줄에서 "찾기"를 통해 이 작업을 수행할 수 있지만 표시된 while 루프에 오류가 표시되는 이유는 무엇입니까?

답변1

디렉토리 구조가 다음과 같다고 가정합니다.

A
|-- B
|   |-- file1.out
|   |-- file2.out
|   `-- file3.out
|-- C
|   |-- file1.out
|   |-- file2.out
|   `-- file3.out
|-- D
|   |-- file1.out
|   |-- file2.out
|   `-- file3.out
`-- E
    |-- file1.out
    |-- file2.out
    `-- file3.out

코드의 문제는 grep다음과 같은 출력을 생성한다는 것입니다.

./B/file1.out:2:some data which includes the word index123
./B/file2.out:2:some data which includes the word index123
./B/file3.out:2:some data which includes the word index123
./C/file1.out:2:some data which includes the word index123
./C/file2.out:2:some data which includes the word index123
./C/file3.out:2:some data which includes the word index123
./D/file1.out:2:some data which includes the word index123
./D/file2.out:2:some data which includes the word index123
./D/file3.out:2:some data which includes the word index123
./E/file1.out:2:some data which includes the word index123
./E/file2.out:2:some data which includes the word index123
./E/file3.out:2:some data which includes the word index123

이것이 출력이다

grep --include=\*.out -rnw . -e "index123"

A현재 디렉토리 로 .

그런 다음 이러한 별도의 줄에서 실행을 시도하지만 최대 두 개의 인수(해당 경로 이름에서 제거된 경로 이름과 접미사)가 필요하기 basename때문에 실패합니다 . basenameGNU는 basename"추가 피연산자"에 대해 불평할 것이고 BSD는 basename잘못된 사용법에 대해 불평할 것입니다.


grep플래그와 함께 이를 사용하면 파일 이름이 표시됩니다(단, 일치하는 전체 행이 아님) -l.

이는 스크립트가 단일 명령으로 대체될 수 있음을 의미합니다.

grep -w -l "index123" */*.out

그러면 양식에 출력이 제공됩니다.

B/file1.out
B/file2.out
B/file3.out
C/file1.out
C/file2.out
C/file3.out
D/file1.out
D/file2.out
D/file3.out
E/file1.out
E/file2.out
E/file3.out

명령줄에서 사용하는 -w것을 추가했습니다 . (또한 사용 중인 번호가 매겨진 행의 경우)는 와 함께 사용할 수 없습니다 .grep-n-l

귀하의 코드로 판단하면 이것이 귀하가 원하는 것입니다.

폴더 이름만 원하면 다음을 수행하십시오.

$ grep -w -l "index123" */*.out | sed 's#/[^/]*##' | sort -u
B
C
D
E

이 모든 것은 이것이 A현재 작업 디렉토리라고 가정하지만 그것이 문제의 경우라고 말했으므로 문제가 되지 않습니다.

답변2

게시물에 따르면while 루프에서 특정 검색으로 파일 찾기해결 방법 중 하나는 다음과 같이 루프를 사용하여 수행할 수 있습니다 while.

#!/bin/bash
while IFS= read -r d;
grep -q "index123" "$d" && dirname "$d"|awk -F'/' '{print $2}'
done < <(find . -maxdepth 2 -type f -name "*.out")

관련 정보