80만개의 로그파일을 rm 시키기...
궁금한게 있어서 질문드립니다...
IBM 유닉스 AiX 인데요...
자동생성되는 로그파일을 안지워서,
엄청 쌓여버렸습니다.
대략, 100만개의 파일이 쌓였고... 용량은 대략 15기가 정도...
이놈들을 지우려는데,
유닉스에서 rm aaa* 처럼 명령 실행할때...
aaa로 시작하는 파일리스트가 3만개 정도 넘어가면, 삭제가 안되더군요...
ksh: /usr/bin/rm: arg list too long 라고 에러가 떨어집니다...
유닉스의 명령실행 절차가 궁금합니다..
(1) 방법
rm -f aaa* 이렇게 하면, aaa로 시작하는 파일을 먼저 ls 로 읽어오는건가요???
이렇게 읽어서 메모리에 올려두고,
그다음에 /bin 밑에있는 rm 명령어를 실행하나요???
(2) 방법
그래서 생각이 들은게,
* 아스타를 사용하면 더 느리지 않을까 싶어서,
rm -f aaabbbccc1
rm -f aaabbbccc2
rm -f aaabbbccc3
rm -f aaabbbccc4
rm -f aaabbbccc5
rm -f aaabbbccc6
rm -f aaabbbccc7
rm -f aaabbbccc8
rm -f aaabbbccc9
rm -f aaabbbccc10
rm -f aaabbbccc11
rm -f aaabbbccc12
rm -f aaabbbccc13
rm -f aaabbbccc14
rm -f aaabbbccc15
rm -f aaabbbccc16
rm -f aaabbbccc17
rm -f aaabbbccc18
rm -f aaabbbccc19
rm -f aaabbbccc20
rm -f aaabbbccc21
...
...
...
이런식으로 파일명을 정확히 주고 삭제하는 방법으로 하고있습니다.
그러다가 또 생각이 들은것은,
newline 마다 rm 명령을 매번 실행하니까, 이것도 느리지 않을까 하는것........
(3) 방법
그렇다면,
rm -f aaabbbccc1 aaabbbccc2 aaabbbccc3 aaabbbccc4 aaabbbccc5 aaabbbccc6 ......................
이렇게 옆으로 나열하면 이게 더 빠를것인가...
(1) (2) (3) 방법 중 어떤 방법이 빠를까요???
.
이렇게 해 보세요.
find . -name "*" -exec rm -rf {};
---------
귓가에 햇살을 받으며 석양까지 행복한 여행을...
웃으며 떠나갔던 것처럼 미소를 띠고 돌아와 마침내 평안하기를...
- 엘프의 인사, 드래곤 라자, 이영도
즐겁게 놀아보자.
http://akpil.egloos.com
---------
귓가에 햇살을 받으며 석양까지 행복한 여행을...
웃으며 떠나갔던 것처럼 미소를 띠고 돌아와 마침내 평안하기를...
- 엘프의 인사, 드래곤 라자, 이영도
즐겁게 놀아보자.
만약 디렉토리
만약 디렉토리 전체를 지워도 된다면
해 보시고 잘 작동하는지 결과 좀 올려주세요. 궁금하네요.
글 올린 사람입니다.....
1.......
find 문 안해봤지만,
안될거 같은데요...
rm -f * 하면 파일리스트 3만개 넘어가면 arg too long 에러 납니다...
2........
시스템 담당자에게 물었을때,
안된다고 한것 같습니다.
디렉토리 날리는것...(원인은 파일이 너무 많아서 디렉토리가 안날라가는것 같던데..)
그냥 쉘처럼 리스트 만들어서, 하나하나 지우는데...
서버에 부하있으면
10만개 날리는데... 10시간도 더걸리네요.... ㅠ.ㅠ
.
.
find 쓰면 될 것도
find 쓰면 될 것도 같은데요.
rm -f * 로 하면 안되는 이유는 아마도 실행이 되기 전에 shell 에서 *를 expand 우선 하고 나서 rm에게 인자를 넘겨주려고 하기 때문에 그런 것 같은데, "*"라고 하면 expand되지 않고 find에게 *를 argument로 넘겨줘서 find가 해석을 하니까, 될겁니다. (ls * 와 ls "*"의 차이...)
1. find는 될것
1. find는 될것 같습니다. 저도 그렇게 하기 때문에..
find에 전체 리스트를 인자로 주는 것이 아니기 때문에 find -name "*" 와 ls *는 전혀 다른 상황입니다.
다만 저는 perl로 이것 과 같은 기능의 프로그램을 만들어 씁니다.(만든다기보다는 Perl Cookbook에 그냥 나와있죠)
훨씬 빠르거든요.
하나씩 지우면
하나씩 지우면 시간이 좀 더 걸릴수 있으니
xargc 같은 프로그램을 사용하시면 도움이 될것 같네요. :)
글 쓴 사람입니다........ find...
find 로 하니까,
되는거 같네요....
워낙에 파일이 많아서, ls 만 쳐도 40분뒤에 뿌려집니다......
(부하 많을때는, 더 오래걸리고요... -_-;
서버는 IBM껀데, 대형사이트의 장비라서, 성능은 엄청난 서버일껍니다...)
그런데 문제는 속도입니다...
하루에 10만개도 못지운다면, 차라리 rm으로 하는게 나을테고...
음...
답변 주신분들 감사합니다...
(ps : 담당자가 깜박하고 로그 지우는걸 잊은건데, 로그파일이 백만개 쌓이니까,
대책이 없네요.... -_-;;;;;
그제는 십만개만 따로 스크립트로 만들어서 돌렸는데... 3시간 반 걸렸는데...
어제는 밤새 돌고 오늘 오후에 끝났네요...(스크립트를 2개 같이 돌렸기 때문에 더 느려진건지...알수가없네요...) )
속도가
속도가 문제라면
스크립트를 써서 rm을 여러번 돌리지 말고 perl이나 Python, 혹은 c, c++ 등을 써서
지워보세요
전에 파일을 10000개 정도 만드는데 touch만드는 것과 Perl로 한번에 만드는 것이 30배 정도 속도 차이가 나더군요.
rm * 이렇게 하면 *는
rm *
이렇게 하면 *는 쉘에서 먼저 해석해서 확장시킨 후 rm을 그 결과와 함께 실행시킵니다.
그래서 말씀하신 것처럼
ksh: /usr/bin/rm: arg list too long
쉘에서(ksh) 오류 정보를 보여주는 것이죠.
해당 프로그램이 쉘에서 해석하는 특수문자(*와 같은)를 별도로 해석한다면 rm '*'와 같이 인용 처리 해줘야 합니다.
그래서 저도
find . -name "*" -exec rm -rf {};
이걸 해보시길 권합니다.
--
마잇
--
마잇
find . -print | xargs rm
find . -print | xargs rm
저도 이게 답이라고 생각하는데요.. ^^
find . | xargs rm # -print 가 기본 expression 이라서 생략 가능합니다.
이 쉘에서 여러개 파일을 삭제하는데는 가장 간단하면서 나을 듯 보입니다.
find . -exec rm '{}' \;
는 매 파일마다 rm 프로세스가 fork되기 때문에 수행시간이 현저히 더 걸릴 것이고,
rm `echo aaa*` 도 args 길이 제한에 걸리기 때문에 여러번 수행해 줘야 하는 번거로움이 있을것이고,
xargs rm 을 쓰는 것이 받을 수 있는 만큼 최대한으로 아규먼트를 받아서 rm 을 한번 수행하고,
또 다음 아규먼트들 받아서 rm 을 수행하는 작업을 자동으로 해 주기 때문에
깔끔하고 좋아보입니다.
find . | xargs -n 1000 rm
find . | xargs -n 1000 rm -f
-n 붙여야 최대한 한번에 삭제하는것으로 알고 있습니다.
-------------------------------------------------------------------------------------------------------
Life ... http://iz4u.net/blog/
------------------------------------------------------------------------------------------------
Life is in 다즐링
echo 를 이용해보세요
AIX에서는 디렉토리 파일이 많은 경우에는 위와 같은 에러가 나더군요
저는 그전에 echo 를 이용해서 해결했습니다.
rm `echo aaa*` 해보세요
흠
`echo ` 로 인자를 넘기나 aaa* 로 넘기나
같은 결과가 나오지 않을까요?
-------------------------------
== warning 대부분 틀린 얘기입니다 warning ===
이는 AIX의 제한입니다.
파일이 많을 때(몇 천개 이상) ls aaa* 하면 에러납니다.
그래서 편법으로 `echo aaa*` 한 겁니다.
경험에 의해서 말씀드린 것입니다.
흠.
인자가 많은 경우는 어쩔 수 없습니다. 끊어서 넘겨줘야죠.
다음과 같이 해보세요.
일만 개씩 끊어서 rm에 인자로 넘깁니다.
find 로 1개씩 exec 하는 것보다는 낫지 않을까요?
-------------------------------
== warning 대부분 틀린 얘기입니다 warning ===
뭐 자세한 소스는 어디있나 몰라서 기억은 안나고
예전에 영 귀찮아서
ls | tail -n 1000
이나, 혹은
ls | head -n 1000
뭐 요런식으로 특정갯수를 정해놓고 해당 리스팅되는 파일명을 변수로 받아서 삭제하는 스크립트를 짜서는 이것때문에 괜히 엄하게 시스템을 말아먹으면 안되니 중간에 가끔 sleep 60 이런식으로 쉬게 해주고는 계속 돌려뒀더랍니다. 뭐 중간중간 1분씩 쉬어도 나중에 보니까 금방 없어지고 그러더만요 -_- 한 몇천개단위쯤 지정해두고 해두면 꽤 편하게 잘 돌아갑니다. 시스템 부하량에 따라서 조절하면 되겠지요. 약간 시간은 걸려도 사용자가 손댈일은 별로 없고 그냥 냅두면 된다 라는게 참 좋습니다. =_=
또 하나의 간단한 방법은 hexedit를 이용하여 그냥 디렉토리를 통째로 날려버리는거지요 =_=;;
==
아 씨끄러 씨끄러~ 조용해!!
레드햇 9 이하 사용금지!
댓글 달기