Bash 지우기 기록 콘텐츠 폴더

Bash 지우기 기록 콘텐츠 폴더

최신 "date_YYYY-MM-DD_HHMMSS" 디렉토리를 유지하고 다른 디렉토리를 삭제하려면 bash 스크립트가 필요합니다.

디렉토리 구조는 다음과 같습니다. 태그의 디렉토리는 변경 가능하며 프로덕션, 스테이징, 개발 등의 "환경"이 변경됩니다. 구체적으로는 "제품명"을 미리 알 수 없습니다

/home/'USER'/'ENVIRONMENT'/Content/'productname'/'date_YYYY-MM-DD_HHMMSS'

나는 노력했다

ls -t  .\directory | tail -n +1

그리고

find .\directory type f -mtime +1 

(지금은 정말 정신없는 시간이고 마지막 며칠만 보관할 수 있어 기쁩니다)

그리고

find . -maxdepth 6 -mindepth 5 -type f -printf '%f\n'

예를 들어, 다음과 같은 경우

/home/USER1/production/Content/productname1/date_20151009_120000
/home/USER1/production/Content/productname1/date_20151010_120000
/home/USER1/production/Content/productname2/date_20151009_120000
/home/USER1/production/Content/productname2/date_20151010_120000
/home/USER1/production/Content/productname1/date_20151009_120000
/home/USER1/production/Content/productname1/date_20151010_120000
/home/USER1/staging/Content/productname2/date_20151009_120000
/home/USER1/staging/Content/productname2/date_20151010_120000

나는 계속할 것이다

/home/USER1/production/Content/productname1/date_20151010_120000
/home/USER1/production/Content/productname2/date_20151010_120000
/home/USER1/staging/Content/productname2/date_20151010_120000

답변1

awk및 의 조합을 사용하여 xargs이를 달성 할 수 있습니다.

sort -r directories | awk -F/ 'cache[$3, $4, $6]++' | xargs -L1 rm -rf

directoriessort -r directories파이프(예: )로 쉽게 대체할 수 있는 모든 디렉터리를 포함하는 파일입니다 printf "%s\n" /home/*/*/Content/*/* | sort -r.

sort -r목록의 "맨 위"에 디렉토리를 배치합니다(날짜를 사전순으로 비교할 수 있다는 점을 활용합니다. 그렇지 않은 경우 먼저 날짜를 올바르게 구문 분석해야 합니다). 마지막으로 계산을 수행하면 처음 볼 때 ( , , ) awk가 인쇄되지 않으며 이후의 모든 항목이 인쇄됩니다. 삭제할 디렉터리 목록을 생성한 다음 / 를 통해 해당 디렉터리를 삭제합니다 .userenvironmentproductxargsrm

참고: 파일 이름/디렉토리에 공백이나 "이상한" 문자가 포함되어 있으면 제대로 작동하지 않으므로 명령을 수정해야 합니다.


awk -F/ 'cache[$3, $4, $6]++'효과 는 무엇입니까 ? 먼저, 입력 행을 분할합니다 /. 그런 다음 각 입력 행에 대해 연관 배열의 세 번째, 네 번째, 여섯 번째 값을 포함하는 튜플이 있는지 확인합니다 cache. 튜플이 처음 표시되면 배열에 없으므로 cache[$3, $4, $6]반환되므로 0행이 제거되고 로 ++설정 cache[$3, $4, $6]됩니다 1. 다음에 튜플이 표시되면 cache[$3, $4, $6]뭔가가 반환될 것입니다 > 0. 이는 해당 줄이 인쇄된다는 의미입니다.

간단한 예는 다음과 같습니다.

$ cat example
a,c,0
a,a,2
c,a,0
a,b,2
b,a,2
a,b,0
c,a,1
b,b,0
a,b,1
a,a,1
a,a,0
b,a,1
b,c,2
b,b,2
b,c,1
a,c,1
c,c,1
$ awk -F, 'cache[$1, $2]++' example
a,b,0
c,a,1
a,b,1
a,a,1
a,a,0
b,a,1
b,b,2
b,c,1
a,c,1
$ fgrep a,b example
a,b,2
a,b,0
a,b,1
$

a,b,2선이 어떻게 떨어지지 a,b,0a,b,1떨어지지 않는지 확인하세요 . 연관 배열과 ++연산자를 사용하는 것은 매우 일반적인 패턴입니다 awk.43. 중복되고 연속되지 않은 줄 삭제.

관련 정보