파일 삭제를 위한 더 짧은 명령

파일 삭제를 위한 더 짧은 명령

우리 웹 서버는 원래 다른 회사에서 유지 관리했습니다. 그들은 캐시 파일을 정리하기 위해 짧은 스크립트를 작성했습니다. 해당 파일에는 다음과 같은 몇 줄이 있습니다.

/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 -- {} +

findPOSIXly로 모든 작업을 수행 하고 포크를 최소화하는 것이 더 효율적입니다 rm.

답변2

명령줄 동작에는 몇 가지 차이점이 있습니다.

  1. 명령 find줄은 파일을 삭제합니다하위 디렉터리에서 반복, rm명령줄은 그렇지 않습니다. 재귀를 원하는지 고려해야합니다.
  2. 가능하다면 명령줄은 find모든 파일을 삭제합니다 . 명령 rm파일을 건너뛸 수 있음예를 들어 셸 기반 설정은 GLOBIGNORE경로 이름 확장 시 일부 파일 이름이 실수로 무시될 수 있는지 고려해야 합니다.
  3. 명령 find원하는 수의 파일을 성공적으로 처리합니다.. 명령 rm실패할 수도 있다경로 이름 확장자가 생성된 경우명령줄그건너무 오래(시스템이 지원하는 것보다 큼). 일부 시스템에는 이에 대한 제한이 있습니다. 삭제해야 할 파일 수를 고려해야 합니다.
  4. 명령 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-xargsxargsfind ... -print0 | xargs -0find -exec command {} +

답변3

다른 답변은 세 가지 사항을 무시합니다.

절대 이렇게 하지 마세요:

/usr/bin/find /var/www/cache/blah/ |xargs /bin/rm -f >/dev/null 2>&1

파일에 공백이 포함되어 있으면 rm두 파일을 모두 삭제하려고 시도하여 놀라운 결과가 생성되기 때문입니다.

findGNU 및 를 사용한다고 가정하고 이 작업을 고집한다면 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이를 지원하는지 확인하십시오.

관련 정보