나는 이 문제가 다시 나타날 것이라고 확신하기 때문에 이 문제에 대한 일반적인 해결책을 찾고 있습니다.
의학 연구를 하는 고객이 있습니다. 우리는 지역 보건 당국이 제공한 데이터 세트를 정기적으로 제거하고 이를 안전하게 수행했음을 입증해야 합니다.
우리는 rsnapshot을 사용하고 유지합니다.
7 dailies,
4 weeklies,
12 monthlies,
4 yearlies.
최근에 rsnapshot 트리에서 몇 년 된 데이터를 제거해야 했는데, 이는 소스 위치에서 다음과 매우 유사했습니다.
/path/to/studyName/data files yyyy mm 01/bunchOfFiles
/path/to/studyName/data files yyyy mm 02/bunchOfFiles
/path/to/studyName/data files yyyy mm 03/bunchOfFiles
/path/to/studyName/randomly placed and named data file 1
/path/to/studyName/randomly named admin file to keep 1
/path/to/studyName/randomly placed and named data file 2
/path/to/studyName/randomly placed and named data file 3
/path/to/studyName/randomly named admin file to keep 2
/path/to/studyName/randomly named admin file to keep 3
/path/to/studyName/randomly placed and named data file 4
/path/to/studyName/randomly named admin file to keep n
/path/to/studyName/randomly placed and named data file 5
./data files* 하위 디렉터리는 다른 많은 조사 위치에도 나타나므로 검색 대상으로 사용할 수 없습니다.
내가 하고 싶은 일은 find와 여러 개의 중첩된 -exec 명령을 포함하는 것입니다. 하지만 find는 이렇게 할 수 없습니다.
첫 번째 -exec 명령에서 bash -c 중첩 -exec를 사용해 보았습니다.처리해야 할 다양한 작업(하위 디렉터리 이름의 공백 등)을 처리한 후 타이머가 종료되어 파일의 모든 인스턴스(또는 데이터가 포함된 하위 디렉터리)를 삭제하는 거대한 rm 명령 모음을 만드는 것이 더 비용 효율적이 되었습니다. 파일).
예를 들어 -execs가 중첩될 수 있다면 다음과 같이 작동할 것이라고 생각합니다.
find /path/to/rsnapshot_tree -type d -name studyName /
-exec 'find {} -type d -iname "data files* -exec rm -rf {} \;'
좋습니다. -exec 종료 및 {}의 모호함으로 인해 작동하지 않지만 의사코드를 고려하세요.
본질적으로,
- rhapshot 트리에서 "studyName" 디렉터리의 각 인스턴스를 찾은 다음 "data files*"에 설명된 3개 디렉터리에 rm -rf를 적용합니다.
- 그런 다음 StudyName 디렉터리에서 잘못 배치된 각 데이터 파일 인스턴스에 대해 이 작업을 반복합니다
.
150개가 넘는 명령 대신 스크립트에서 6개의 명령을 올바르게 복사하고, 붙여넣고, 편집하고 사용해야 했습니다.
더 나은 접근 방식에 대한 제안을 주시면 감사하겠습니다.
Linux(debian/ubuntu) 및 freeBSD 호스트에서 호스팅되는 rsnapshot 트리가 있습니다. Bash는 항상 쉘입니다(freeBSD 호스트에서 기본값을 변경했습니다).
답변1
귀하의 질문에 대해 완전히 명확하지는 않지만 다음과 같은 디렉토리 구조가 있는 경우 -
a
a/data
a/data/file1
a/studyName
a/studyName/data
a/studyName/data/file1
a/studyName/data/file2
a/studyName/data/file3
StudyName/data/fileX를 찾고 있다면 다음을 수행할 수 있습니다.
find . -path "*studyName/data*" -type f
./a/studyName/data/file1
./a/studyName/data/file2
./a/studyName/data/file3