문자열이 포함된 파일을 찾아 해당 파일의 전체 내용을 새 파일에 추가합니다.

문자열이 포함된 파일을 찾아 해당 파일의 전체 내용을 새 파일에 추가합니다.

다음 요구 사항을 충족하기 위해 bash 쉘 스크립트를 작성하는 데 도움을 줄 수 있는 사람이 있습니까? "file.txt"라는 새 파일을 만든 다음 "Format"으로 시작하는 첫 번째 줄이 포함된 파일을 검색하고 해당 파일의 전체 내용을 새 파일 "file.txt"에 넣습니다. 새 파일에 추가 결과를 생성하려면 현재 디렉터리의 모든 파일에 대해 이 작업을 수행해야 합니다.

답변1

find . -maxdepth 1 -type f \
        -exec awk 'NR == 1 && /^Format/ { exit 0 } { exit 1 }' {} \; \
        -exec cat {} \; > /tmp/file.txt

그러면 현재 디렉터리에서 모든 일반 파일을 찾아 awk각 파일에 대해 차례로 스크립트를 실행합니다. -maxdepth 1재귀 검색에 대한 매개변수가 제거되었습니다 .

awk현재 파일의 첫 번째 줄 시작 부분에 "Format"이라는 단어가 포함되어 있으면 스크립트는 종료 상태 0으로 종료됩니다. 그렇지 않은 경우 종료 상태 1로 종료합니다.

awk스크립트가 종료 상태 0으로 종료되면 명령 은 find계속해서 cat파일을 호출하여 해당 내용을 표준 출력으로 인쇄합니다.

find로 리디렉션하면 /tmp/file.txt최종 출력을 위한 모든 파일이 로 cat이동됩니다 /tmp/file.txt. find명령 실행이 시작되기 전에 파일이 셸에 의해 잘립니다(비워집니다).

명령이 무한 루프에 file.txt빠질 수 있으므로 현재 디렉터리에 파일을 생성하고 싶지 않습니다 .find


여기에 사용되는 매개변수는 find다음과 같습니다.시험발견에 관한 것 find. 테스트가 성공하면 다음 테스트가 실행됩니다. 하나의 테스트가 실패하면 find계속해서 다른 테스트를 찾으십시오.

  • -maxdepth 1입력할 경우 디렉터리 깊이 1을 초과하는 디렉터리가 발견되면 find테스트가 실패합니다. find따라서 최상위 디렉터리 수준에만 유지됩니다.

  • -type f비정규 파일(예: 디렉터리, 소켓, 장치 파일 등)의 경우 이 작업이 실패합니다.

  • -exec실행된 명령이 0이 아닌 종료 상태를 반환하면 테스트가 실패합니다.

답변2

루프 grep결과:

truncate -s 0 file.txt

for match in $(grep -lr "$STRING" --exclude file.txt .); do
    cat "$match" >> file.txt
done

truncate파일이 존재하지 않으면 새 파일을 생성하거나 기존 파일을 지웁니다.

관련 정보