우리 웹 서버는 원래 다른 회사에서 유지 관리했습니다. 그들은 캐시 파일을 정리하기 위해 짧은 스크립트를 작성했습니다. 해당 파일에는 다음과 같은 몇 줄이 있습니다.
/usr/bin/find /var/www/cache/blah/ |xargs /bin/rm -f >/dev/null 2>&1
그냥 쓸 수 없는 이유가 있나요?
/bin/rm -f /var/www/cache/blah/*
파일 삭제? 특정 표준이 필요할 때 사용하는 것을 볼 수 있지만 find
이 경우에는 찾을 수 없는 것 같습니다.
답변1
find
+를 사용하는 이유를 생각해 볼 수 있습니다 xargs
.
캐시된 파일이 너무 많은 경우를 처리하십시오. 이는
rm
하나의 명령만 실행하면 오류가 발생합니다.와일드카드는
*
숨겨진 파일을 확장하지 않습니다.재귀적으로 작업합니다.
그러나 이 find
+는 xargs
필터를 추가하지 않으면 find
결과에 디렉터리와 파일이 포함되므로 효율적이지 않습니다. 디렉토리에서 실행하면 /bin/rm -f
오류가 발생하며 해당 위치는 으로 리디렉션됩니다 stderr
. stdout
이름 /dev/null
에 특수 문자가 포함된 파일에 대해서도 명령이 실패합니다.
개선된 솔루션은 다음과 같습니다.
find /var/www/cache/blah -type f -exec rm -f -- {} +
find
POSIXly로 모든 작업을 수행 하고 포크를 최소화하는 것이 더 효율적입니다 rm
.
답변2
명령줄 동작에는 몇 가지 차이점이 있습니다.
- 명령
find
줄은 파일을 삭제합니다하위 디렉터리에서 반복,rm
명령줄은 그렇지 않습니다. 재귀를 원하는지 고려해야합니다. - 가능하다면 명령줄은
find
모든 파일을 삭제합니다 . 명령rm
줄파일을 건너뛸 수 있음예를 들어 셸 기반 설정은GLOBIGNORE
경로 이름 확장 시 일부 파일 이름이 실수로 무시될 수 있는지 고려해야 합니다. - 명령
find
줄원하는 수의 파일을 성공적으로 처리합니다.. 명령rm
줄실패할 수도 있다경로 이름 확장자가 생성된 경우명령줄그건너무 오래(시스템이 지원하는 것보다 큼). 일부 시스템에는 이에 대한 제한이 있습니다. 삭제해야 할 파일 수를 고려해야 합니다. - 명령
find
줄은 모든 출력 메시지를 무시합니다(redirect to 사용>/dev/null
). 명령줄에서rm
출력 메시지를 인쇄합니다 . 메시지가 어떻게 될지 고려해야 합니다.
이러한 차이점이 귀하에게 중요하지 않다면 그렇게 /bin/rm -f /var/www/cache/blah/*
될 것입니다.
파일만 삭제하고 디렉토리를 유지한다면 실제로 사용할 것입니다.
/usr/bin/find /var/www/cache/blah/ -not -type d -exec /bin/rm -f -- {} + >/dev/null 2>&1
또는
/usr/bin/find /var/www/cache/blah/ -type f -exec /bin/rm -f -- {} + >/dev/null 2>&1
귀하의 목적에 맞는 것이 무엇이든 둘 다 장점과 단점이 있습니다.
-exec command {} +
비슷한 방식으로 작동 xargs
하지만 약간 더 효율적입니다. 파일 이름 중 하나 --
가 . 공백과 같은 특수 문자는 실제로 간단한 호출을 중단할 수 있습니다 . 비슷한 것이 필요하면 훨씬 간단합니다.rm
-
xargs
xargs
find ... -print0 | xargs -0
find -exec command {} +
답변3
다른 답변은 세 가지 사항을 무시합니다.
절대 이렇게 하지 마세요:
/usr/bin/find /var/www/cache/blah/ |xargs /bin/rm -f >/dev/null 2>&1
파일에 공백이 포함되어 있으면 rm
두 파일을 모두 삭제하려고 시도하여 놀라운 결과가 생성되기 때문입니다.
find
GNU 및 를 사용한다고 가정하고 이 작업을 고집한다면 xargs
다음을 수행해야 합니다.
/usr/bin/find /var/www/cache/blah/ -print0 | xargs -0 /bin/rm -f >/dev/null 2>&1
여기서 0은 파일을 종료합니다(xargs에서는 0 종료가 예상됩니다).
둘째, 디렉토리를 삭제해 보셨나요? 그렇지 않은 경우 "-type f"가 필요합니다. 그렇다면 "rm -rf" rm
없이는 -r
디렉토리가 삭제되지 않으므로 "rm -rf"가 필요합니다.
그러나 결론은 OP가 더 짧은 접근 방식을 요구했고 대답이 더 길어 보인다는 것입니다. 어때요?
/usr/bin/find /var/www/cache/blah/ -delete
나는 -delete
이것이 GNU 확장이라고 생각하므로 귀하의 버전이 find
이를 지원하는지 확인하십시오.