특정 디렉터리에서는 파일 형식을 제거하지만 하위 디렉터리에서는 제거하지 않습니다.

특정 디렉터리에서는 파일 형식을 제거하지만 하위 디렉터리에서는 제거하지 않습니다.

저는 현재 HP-UX에서 작업 중이며 보존 정책에 따라 특정 일수가 지난 파일을 삭제하는 cron 작업을 매일 아침 실행하고 있습니다. 최근에 파일이 삭제되는 경로에 하위 디렉터리를 추가했는데 해당 하위 디렉터리 아래의 파일에 대해 다른 정책을 적용하고 싶습니다.

현재 내 명령은 다음과 같습니다.

find /directory/backup -mtime +1 -name "FileName*.EXT" -exec rm {} \; 

이 명령을 실행하면 백업 디렉터리 아래의 모든 파일과 백업 하위 디렉터리 내에서 일치하는 모든 파일이 삭제됩니다. 내 말은 백업 디렉터리 안에 backup_db라는 또 다른 디렉터리가 있다는 것입니다.

pwd
/directory/backup/backup_db

하위 디렉터리가 아닌 백업 디렉터리로만 삭제를 제한하고 싶습니다. 어떻게 해야 하나요? 어떤 도움이라도 대단히 감사하겠습니다.

나는 노력했다남자 RM하지만 나에게 도움이 될 만한 어떤 것도 찾지 못했습니다.

답변1

명령줄을 통해 이 find명령은 일련의 개별 rm명령을 생성하고 실행합니다. 각 rm명령은 전체 경로 이름으로 지정된 파일을 삭제합니다. 그러니 rm제한할 필요 는 없지만 find.

이를 수행하는 구문은 역사적인 이유로 인해 약간 까다로울 수 있습니다. 다음을 수행할 수 있습니다.

find /directory/backup ! -path /directory/backup -prune -mtime +1 -type f -name "FileName*.EXT" -exec rm {}\+

이는 단일 디렉토리를 제한하는 POSIX 호환 방법입니다 find $DIR ! -path $DIR -prune <desired_conditions> [desired_action]. find그러나 추가 조건을 추가하지 않는 한 해당 특정 디렉터리의 하위 디렉터리 이름은 계속 나열됩니다.

를 사용하면 백업 디렉터리 내의 하위 디렉터리에 대한 명령을 생성하려는 시도가 -type f제한됩니다 . 그러면 쓸모없는 오류 메시지가 생성됩니다. 디렉터리를 삭제하려면 또는 을 반복해야 합니다. 이 경우에는 수행하고 싶지 않은 작업입니다.findrmrmrmdir

-exec삭제할 파일이 많은 경우 명령 사양 끝의 세미콜론을 더하기 기호로 바꾸면 성능이 향상됩니다. rm각 파일에 대해 하나의 명령을 생성하는 대신 가능한 적은 수의 명령을 생성하여 최대한 많은 경로 이름 인수를 채웁니다. 가능한 rm한 명령줄 길이가 허용하는 한 모든 명령에 추가하십시오. 이는 새로운 프로세스의 필요성을 크게 줄여줍니다 fork().

답변2

귀하의 질문은 with가 아니라 rmwith 입니다 find. -maxdepth 0검색을 시작 디렉터리로 제한하려면 이 옵션을 사용합니다 .

-maxdepth귀하의 버전이 이를 지원하지 않는 경우 디렉터리를 find사용하고 제외할 수도 있습니다 .-path-prune

전체 디렉토리 트리를 무시하려면 트리의 모든 파일을 확인하는 대신 -prune을 사용하십시오. 예를 들어, "src/emacs" 디렉터리와 그 아래의 모든 파일 및 디렉터리를 건너뛰고 발견된 다른 파일의 이름을 인쇄하려면 다음을 수행하십시오.

찾다. -경로 ./src/emacs -prune -o -print

관련 정보