특정 디렉터리에서 특정 콘텐츠가 포함된 모든 *.xml.err 파일을 찾으려면 *.xml 파일을 상위 디렉터리로 이동하고 *.xml.err 파일을 삭제해야 합니다.

특정 디렉터리에서 특정 콘텐츠가 포함된 모든 *.xml.err 파일을 찾으려면 *.xml 파일을 상위 디렉터리로 이동하고 *.xml.err 파일을 삭제해야 합니다.

Linux 쉘 명령을 작성하려고 하는데 여기서 멈췄습니다.

배경은 다음과 같습니다.

시스템이 생성합니다.xml 및.xml.error는 다음에 해당합니다./tmp/A/처리됨,/tmp/A/not_processed,/tmp/B/처리됨,/tmp/B/not_processed목차. 전체 카탈로그가 정의되지 않았습니다. 예를 들어/tmp/C /tmp/D...

아래에서 콘텐츠에 "oracle"이 포함된 모든 *.xml.err 파일을 찾아야 합니다./tmp/A/not_processed그리고/tmp/B/not_processed. 그런 다음 *.xml 파일을 상위 디렉터리로 이동해야 합니다./tmp/A또는/tmp/B그리고 *.xml.err 파일을 삭제하세요.

다음은 문제가 없는 코드입니다.

find /home/tmp  -name \*.err -type f -path "*not_processed*" -execdir grep -l -i "oracle" {} \; -execdir sh -c '
    for name do
        mv "${name%.*}" ".."
        rm -rf  "$name"
    done' sh {} +

찾기 위해 여러 -execdir 인수를 사용하여 -for 루프를 제거하여 성능을 최적화하려고 합니다.

find /home/tmp  -name \*.err -type f -path "*not_processed*" -execdir grep -l -i "oracle" {} \; -execdir mv {} .. \; -execdir rm -rf {} \;

그러나 -execdir mv {} .. \;두 번째 확장 프로그램을 제거할 수 없습니다 .err. {}는 파일 경로를 포함하는 배열이어야 합니다. 예를 들어, {} 뒤에 ./a.xml.err ./b.xml.err간단히 추가하려고 했는데 작동했습니다 . 이제 확장자를 추가하는 방법을 알았지 만 여전히 {}의 확장자를 제거하는 중입니다..err-execdir mv {}.err .. \;./a.xml.err.err ./b.xml.err.err.err.err

미리 감사드리며 귀하의 노고에 감사드립니다.

답변1

각 파일에 대해 새 셸을 생성하고 있습니다.

find루프의 출력을 read루프 에 (올바르게) 연결하고 그 안에서 작동하면 어느 정도 성능을 얻을 수 있습니다 .

.err그렇지 않으면 혼잡한 트리 구조를 크롤링하는 데 비용이 많이 들고 grep할 파일 수가 계속 늘어나는 추가 파일이 누적될 것 같습니다 .

전체적으로 볼 때, 최고의 성능 향상은 원래 문제를 일으킨 응용 프로그램을 수정하는 것입니다.

관련 정보