가장 오래된 파일 제거

가장 오래된 파일 제거

디렉토리에서 오래된 파일을 삭제하고 최신 파일 3개만 남겨두려고 합니다.

cd /home/user1/test

while [ `ls -lAR | grep ^- | wc -l` < 3 ] ; do

    rm `ls -t1 /home/user/test | tail -1`
    echo " - - - "

done

조건문에 뭔가 문제가 있습니다.

답변1

파일을 반복하고 싶다면,절대 사용하지 마세요ls*. tl;dr 잘못된 파일을 삭제하거나 심지어 모든 파일을 삭제하게 되는 상황이 많이 있습니다.

즉, 불행하게도 이것은 Bash에서 제대로 수행하기 까다로운 일입니다. 작동하는 답변이 있습니다중복 질문 내 나이가 더 많아find_date_sorted약간만 수정하여 사용할 수 있습니다.

counter=0
while IFS= read -r -d '' -u 9
do
    let ++counter
    if [[ counter -gt 3 ]]
    then
        path="${REPLY#* }" # Remove the modification time
        echo -e "$path" # Test
        # rm -v -- "$path" # Uncomment when you're sure it works
    fi
done 9< <(find . -mindepth 1 -type f -printf '%TY-%Tm-%TdT%TH:%TM:%TS %p\0' | sort -rz) # Find and sort by date, newest first

* 공격하지 마십시오. 저도 ls이전에 사용했습니다. 하지만 실제로는 안전하지 않습니다.

편집하다:새로운find_date_sorted단위 테스트로.

답변2

zsh glob을 사용하여 3개의 최신 파일을 제외한 모든 파일을 삭제하려면 Om(대문자 O)를 사용하여 가장 오래된 파일부터 최신 파일까지 정렬하고 아래 첨자를 사용하여 원하는 파일을 가져올 수 있습니다.

rm ./*(Om[1,-4])
#    | ||||  ` stop at the 4th to the last file (leaving out the 3 newest)
#    | |||` start with first file (oldest in this case)
#    | ||` subscript to pick one or a range of files
#    | |` look at modified time
#    | ` sort in descending order
#    ` start by looking at all files

기타 예:

# delete oldest file (both do the same thing)
rm ./*(Om[1])
rm ./*(om[-1])

# delete oldest two files
rm ./*(Om[1,2])

# delete everything but the oldest file
rm ./*(om[1,-2])

답변3

지금까지 가장 쉬운 방법은 zsh와 그 기능을 사용하는 것입니다.글로벌 한정자: Om연령을 내림차순으로 정렬하고(즉, 가장 오래된 것부터) [1,3]처음 3개의 일치 항목만 유지합니다.

rm ./*(Om[1,3])

또한보십시오zsh에서 glob을 어떻게 필터링합니까?더 많은 예를 보려면.

그리고 주의하세요l0b0의 조언: 파일 이름에 셸 특수 문자가 포함되어 있으면 코드가 심각하게 깨집니다.

답변4

첫째, -R옵션은 재귀를 위한 것입니다. 이는 아마도 여러분이 원하는 것이 아닐 것입니다. 이는 모든 하위 디렉터리에서도 검색됩니다. 둘째, <연산자(리디렉션으로 표시되지 않는 경우)는 문자열 비교를 위한 것입니다. 당신은 아마 원할 것입니다 -lt. 노력하다:

while [ `ls -1A | grep ^- | wc -l` -lt 3 ]

하지만 여기서는 find를 사용하겠습니다.

while [ `find . -maxdepth 1 -type f -print | wc -l` -lt 3 ]

관련 정보