디렉토리에서 오래된 파일을 제거하고 최신 파일 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에서 글로브를 필터링하는 방법더 많은 예시를 알아보세요.
그리고 참고l0b0의 제안: 파일 이름에 셸 특수 문자가 포함되어 있으면 코드가 심하게 충돌합니다.
답변4
첫째, 이 -R
옵션은 재귀를 위한 것으로 원하는 것이 아닐 수도 있습니다. 또한 모든 하위 디렉터리에서도 검색합니다. 둘째, <
연산자(리디렉션으로 간주되지 않는 경우)가 문자열 비교에 사용됩니다. 당신은 원할 수도 있습니다 -lt
. 노력하다:
while [ `ls -1A | grep ^- | wc -l` -lt 3 ]
하지만 여기서는 find를 사용하겠습니다.
while [ `find . -maxdepth 1 -type f -print | wc -l` -lt 3 ]