현재 다음 명령을 사용하여 10줄 미만의 디렉터리 및 하위 디렉터리에 있는 모든 파일을 반복적으로 삭제하고 싶습니다.
find . -type f -name "*.txt" | while read; do
(($(cat $THISFILE | wc -l) < 10)) && rm -vf "$THISFILE"; done
find
일부 명령을 병렬화하기 위해 with를 사용했지만 xargs
여기서는 with 라인에서 테스트한 이후로 어떻게 해야 할지 모르겠습니다.wc -l
있습니까? 없는지! 어떻게 하면 더 빠르게 만들 수 있나요 xargs
?
답변1
(내가 아는 한) 검색 자체는 병렬로 실행될 수 없습니다.
xargs는 이를 수행할 수 있으며, xargs를 사용하여 이를 수행하는 가장 쉬운 방법은 이를 쉘 스크립트로 래핑하는 것입니다.
하지만 그렇게 하기 전에 상황을 최적화해야 합니다. cat
파일이 실제로 연결되지 않으면 쓸모가 없습니다. 파일에 10개 이상의 라인이 있는지 확인하기 위해 모든 라인을 셀 필요는 없습니다. 그래서 저는 다음과 같은 조건을 제안합니다.
[ $(head -n 10 "$file" | wc -l) -lt 10 ] && echo rm "$file"
최대 처음 10줄만 읽고 파일이 많지 않으면 삭제합니다(rm은 약간 위험하므로 echo
먼저 테스트할 수 있도록 추가했습니다). cat과 달리 head는 실제로 10줄에 도달하면 읽기를 중지하므로 디렉터리의 파일이 10줄보다 길면 프로세스 속도가 크게 빨라집니다.
다음과 같이 쉘 스크립트로 감싸십시오.
#!/bin/bash
for file in "$@"
do
[ $(head -n 10 "$file" | wc -l) -lt 10 ] && echo rm "$file"
done
다중 처리를 위해 find + xargs를 사용할 수 있습니다.
find . -type f -name "*.txt" -print0 | xargs -0 -P 4 -n 8 ./rm10lines.sh
(프로세스 4개 -P 4
) 및 -n 8
(셸 스크립트 호출당 인수 8개)는 예시이므로 원하는 대로 조정하세요. 파일이 많다는 것을 알고 있다면 더 큰 -n을 사용하여 쉘 스크립트를 다시 생성하여 오버헤드를 줄이세요.