
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할 파일 수가 계속 늘어나는 추가 파일이 누적될 것 같습니다 .
전체적으로 볼 때, 최고의 성능 향상은 원래 문제를 일으킨 응용 프로그램을 수정하는 것입니다.