2015-01-23 3 views
1

그 전에 현재 로그와 로그를 제외한 모든 로그를 제거하고 싶습니다. 이러한 로그 파일은 20 minutes.So 파일 이름 뒤에 생성, 19 시간 (7시), 10, 30 23 오늘의 날짜입니다 Rm과 Egrep -v 콤보

abc_23_19_10_3341.log 
abc_23_19_30_3342.log 
abc_23_19_50_3241.log 
abc_23_20_10_3421.log 

처럼 (또한 어제 날짜를 포함 할 수 있습니다)입니다 50,10 분입니다.

이 경우 나는 현재 기록중인 현재 로그 인 abc_23_20_10_3421.log와 이전의 abc_23_19_50_3241.log ( )를 보존하고 나머지는 제거하고 싶습니다.

나는

내가이

files_nodelete=`ls -t | head -n 2 | tr '\n' '|'` 
rm *.txt | egrep -v "$files_nodelete" 
을 시도 ... 그건 너무 오래입니다 해하지을 삭제 한 후, 폴더를 만들고 해당 폴더의 첫 번째 파일을 넣고 파일을 제거하여 작동하도록 있어요

하지만 작동하지 않았다.하지만 rm 대신 ls를 넣으면 작동한다.

나는 리눅스에서 아마추어 다. 단순한 생각을 제안해라. 논리가있다. xargs rm 나는 시험했다. 그러나 그것은 didnt한다.

은 또한 mtime에 대해 읽을 수 있지만 내가 솔라리스에서은 logadm 도구를 사용해보십시오 Solaris 시스템

답변

0

모든 답변을 주셔서 감사합니다. 내가

files=`ls -t *.txt | head -n 2 | tr '\n' '|' | rev |cut -c 2- |rev` 
rm `ls -t | egrep -v "$files"` 

이 도움을 주셔서 감사합니다 내 대답을 발견

1

는 보통 파일을 가리 키도록 LS를 사용하는 것은 좋지 않습니다. 일부 파일은 혼란을 야기 할 수 있습니다 (이름에 [개행 문자] 또는 이상한 문자가있는 파일은 일반적인 예입니다 ....).

쉘 globs 사용 : 여기 interresting 방법입니다 : 우리는 우리가 제거하려고하는 것보다 새로운 파일을 계산합니다!

pattern='abc*.log' 
for i in $pattern ; do 
    [ -f "$i" ] || break ; 
    #determine if this is the most recent file, in the current directory 
    # [I add -maxdepth 1 to limit the find to only that directory, no subdirs] 
    if [ $(find . -maxdepth 1 -name "$pattern" -type f -newer "$i" -print0 | tr -cd '\000' | tr '\000' '+' | wc -c) -gt 1 ]; 
    then 
     #there are 2 files more recent than $i that match the pattern 
     #we can delete $i 
     echo rm "$i" # remove the echo only when you are 100% sure that you want to delete all those files ! 
    else 
     echo "$i is one of the 2 most recent files matching '${pattern}', I keep it" 
    fi 
done 

난 단지 "찾기"로 파일 이름을 공급하는 글 로빙 메커니즘을 사용, 그냥 이렇게합니다 (아웃풋이 파일 이름을 계산하는 "0"-printf0의 종료를 사용하는 나는 그 어떤 특수 문자 아무런 문제가 없다 파일명, 나는 단지 얼마나 많은 파일이 출력되었는지 알 필요가있다.)

tr -cd "\000"\000, 즉 print0이 출력하는 종료 NUL 문자 만 유지하게된다. 그런 다음 각 \000을 하나의 + 문자로 번역하고 wc -c으로 계산합니다. 0을 보면 "$ i"가 ​​가장 최근 파일이었습니다. 내가 1을 본다면, "$ i"는 조금 더 오래된 것입니다 (그래서 가장 최근의 것을 발견합니다). 그리고 1을 초과하면 2 개의 파일 (패턴을 mathching하는)이 "$ i"보다 최신이므로 "$ i"를 삭제할 수 있음을 의미합니다.

누군가가 조치를 취할 것으로 확신합니다. 더 나은 것을 가지고 있지만 아이디어는 재사용 될 수 있습니다.

1

당신이 원하는 경우 시도에서이 문제를 해결하기위한 방안 비슷한 (하지만 작업) :

ls abc*.log | sort | head -n-2 | xargs rm 

ls abc*.log : 목록에있는 모든 파일, 패턴 매칭 abc*.log
sort : 종류 (이름)이 목록 사전 편찬 oldes에서 가장 최근에 로그 파일에
head -n-2 다음 rm를 구성 : 목록의 마지막 두 항목 만 모두
xargs rm (당신이 -n 너무 negativ 수를 줄 수) 반환 디렉토리에 두 이하의 파일이있는 경우

를 stdin에서 항목과 명령이 명령은

rm: missing operand 

같은 오류를 반환하고 파일을 삭제하지 않습니다.

+1

일반적인주의 적용 : LS를 구문 분석하지 않습니다 http://mywiki.wooledge.org/ParsingLs 당신은에서 불만을 피할 수 –

+0

' rm'에'-f'를 추가합니다. 그것에 대해 신중해야하지만, 그것이 당신이 원하는 것입니다. 이름에 공백이나 다른 부적절한 문자가 없다면'ls' 출력을 파싱하는 것은 위험하지 않습니다. 문제는 확신 할 수 있는지 여부입니다. –