좋아, 외장 하드 드라이브에서 grep을 사용하고 있어
예,
M:/
grep -rhI "bananas" . > out.txt
그러면 "M:/"에 "banana"가 포함된 모든 줄이 출력됩니다.
그러나 파일의 전체 내용을 출력하고 싶기 때문에 example.txt의 줄에 "bananas"가 포함되어 있으면 example.txt의 전체 내용이 출력되고 디렉토리 "M:/" . " 바나나".
답변1
grep -r "bananas" | cut -d: -f1 | xargs cat >> result.txt
grep
-r
: 재귀. 각 디렉터리의 모든 파일을 반복적으로 읽습니다.
결과: file_name:text
각 행에 대해. 예를 들어 foo.txt:bananas
.
이제 각 줄에서 파일 이름을 가져와야 합니다.
자르다sed
부분선 삭제를 위한 간단한 편집기( 또는 여기를 사용할 수 있지만 awk
잘라내기가 간단함)
-d
분리 기호. 게시물 파일이 있으므로:
구분 기호는 다음과 같습니다.-d:
-f
출력을 필드로 분할합니다. 어느 것을 복용해야 합니까?-f1
- 첫 번째!
매개변수
이제 파일 목록이 생겼습니다. 그들과 관련이 있나요? xargs
표준 입력에서 명령줄을 작성하고 실행하는 데 이를 사용합니다 . 표준 입력에서 파일 이름을 받아들이고 cat
파일 이름을 인수로 제공하는 각 줄에 대해 실행됩니다. 간단히 cat
그 내용을 표준 출력으로 인쇄합니다.
>>
"파일에 추가"를 의미합니다.
답변2
grep -rlZI "bananas" . | xargs -0 cat > out.txt
-lZ
일치하는 파일 이름의 빈 구분 목록을 출력합니다 .
-l, --files-with-matches
Suppress normal output; instead print the name of each input
file from which output would normally have been printed. The
scanning will stop on the first match.
-Z, --null
Output a zero byte (the ASCII NUL character) instead of the
character that normally follows a file name. For example, grep
-lZ outputs a zero byte after each file name instead of the
usual newline. This option makes the output unambiguous, even
in the presence of file names containing unusual characters like
newlines. This option can be used with commands like find
-print0, perl -0, sort -z, and xargs -0 to process arbitrary
file names, even those that contain newline characters.
grep 버전이 해당 옵션을 제공하지 않는 경우 일반으로 돌아갈 수 있습니다. 그러면 -Z
구분 기호를 개행 문자로 설정하는 한 -l
공백이 포함된 파일 이름(당연히 개행 문자는 포함되지 않음)을 처리 할 수 있습니다.xargs
grep -rlI "bananas" . | xargs -d '\n' cat > out.txt