2008-09-16 6 views
4

상위 디렉토리에있는 4 개의 최신 디렉토리를 제외하고 모두 삭제하려고합니다. 배시에서 어떻게하면 좋을까요?4 개의 최신 디렉토리를 제외하고 모두 삭제

+0

파일이나 디렉토리의 생성 시간은 어디에도 저장되어 있지 않으므로 검색 할 수 없습니다. 얻을 수있는 가장 가까운 것은 inode 변경 시간입니다 : http://www.faqs.org/faqs/unix-faq/faq/part3/section-1.html 디렉토리에 파일을 추가하거나 제거하면 inode가 변경됩니다. –

+0

... 자식 디렉토리에서 파일을 추가 또는 제거하더라도 부모 inode는 변경되지 * 않습니다. –

답변

9
ls -atrd */ | head --lines=-4 | xargs rm -rf 

편집 :는 네 가지를 제외한 모든 (파일과 디렉토리)을 의미한다 "모든 디렉토리하지만 네 newst 것들을 삭제"또는 "삭제하면 'A'인수가 명확히하십시오

+0

이것은 가장 최근에 생성 된 4 개의 디렉토리 대신에 가장 최근에 수정 된 4 개의 디렉토리를 남기고, 점으로 시작하는 디렉토리에 주목하지 않고, 개행을 포함하는 이름에 대해 머리를 깨고, 공백을 포함하는 이름에 대해 xargs를 깨고, rm은 오류 메시지를 인쇄합니다 삭제할 것이 없다면. –

+0

좋은 지적. 나는 이제 'a'를 점에 찍은 디렉토리를 캡처하기 위해 추가했고 현재와 부모 디렉토리를 없애기 위해 grepped했다.하지만 네가 맞다. 이것은 당신이 지적한 것처럼 몇 가지 중요한 한계가있는 간단한 대답입니다. –

+0

수정 사항 : 현재 및 상위 디렉토리를 필터링하는 데 grep이 필요하지 않습니다. ls * / –

1

을에 ls에 추가 최신 디렉토리 ".

디렉토리에 대한 생성 시간을 알 수 없습니다. 디렉토리가 마지막으로 수정 된 시점, 즉 파일이 추가, 제거 또는 이름 변경된 경우에만 알 수 있습니다.

1

당신이 할 수있는 다음 :

#!/bin/bash 

#store the listing of current directory in var 
mydir=`ls -t` 
it=1 

for file in $mydir 
    do 
     if [ $it -gt 5 ] 
     then 
      echo file $it will be deleted: $file 
      #rm -rf $file 
     fi 
     it=$((it+1)) 
    done 

가 (정말 일어날 수 있도록 RM 전에 #를 제거) 배열, 그것을 할)

0

또 다른, BSD 안전, 방법 (이유 아니요?)

#!/bin/bash 
ARRAY=(`ls -td */`) 
ELEMENTS=${#ARRAY[@]} 
COUNTER=4 
while [ $COUNTER -lt $ELEMENTS ]; do 
    echo ${ARRAY[${COUNTER}]} 
    let COUNTER=COUNTER+1 
done 
관련 문제