2010-03-23 5 views
0

배포가 진행되는 디렉토리가 있습니다. 전개는 (자체 디렉토리입니다) 형식으로 이름 :기존 배포를 삭제하는 bash 스크립트

<application-name>_<date> 

e.g. trader-gui_20091102 

가이 같은 상위 디렉토리에 배포 여러 응용 프로그램은, 그래서 상위 디렉토리의 내용은 다음과 같이 보일 수 있습니다 :

trader-gui_20091106 
trader-gui_20091102 
trader-gui_20091010 
simulator_20091106 
simulator_20091102 
simulator_20090910 
simulator_20090820 

각 응용 프로그램의 최신 버전을 제외한 모든 배포를 제거하기위한 bash 스크립트를 작성하고 싶습니다. (배치 이름의 날짜로 가장 최근에 표시됨). 위의 부모 디렉토리에서 bash 스크립트를 실행하면 다음과 같은 결과가 남습니다.

trader-gui_20091106 
simulator_20091106 

도움이 되셨을 것입니다.

답변

1

빠른 한 줄 :

ls | sed 's/_[0-9]\{8\}$//' | uniq | 
while read name; do 
    rm $(ls -r ${name}* | tail -n +2) 
done 

목록 파일 만 고유 한 이름을 유지, 8 자리 다음에 밑줄을 잘라. 각 이름에 대해 가장 최근의 것을 제외한 모든 것을 제거하십시오.

가정 :

  • 사전 순으로 분류 할 때 마지막이 될 것입니다 가장 최근. 그런 경우가 아니면 파이프 라인에 원하는 것을 수행하는 정렬을 추가하십시오. tail -n +2
  • 이 디렉토리에 다른 파일이 없습니다. 있다면, ls의 출력을 제한하거나 grep을 통해 파이프하여 원하는 것을 선택하십시오.
  • 파일 이름에 이상한 문자가 없습니다. 만약 ... 내부 ls 파이프 라인의 결과물을 직접 사용하는 대신에, 다른 루프에 파이프를 연결하여 개별 라인을 따옴표로 묶을 수 있습니다. 그렇지 않으면 배열로 캡처하여 인용 확장. 파일 이름에 날짜가 이미 "정렬"때문에
+0

위대한 일을, 감사합니다. – Ben

0
shopt -s exglob 
ls|awk -F"_" '{a[$1]=$NF}END{for(i in a)print i"_"a[i]}'|while read -r F 
do 
    rm !($F) 
done 

는 awk 명령은 각 응용 프로그램의 최신 파일을 찾습니다. rm (!$F)은 최신이 아닌 파일 이름을 삭제한다는 의미입니다.

0

당신은 를 찾을 시도 할 수 :

# Example: Find and delete all directories in /tmp/ older than 7 days: 
find /tmp/ -type d -mtime +7 -exec rm -rf {} \; &>/dev/null