80만개의 로그파일을 rm 시키기...

ohmyfl의 이미지

궁금한게 있어서 질문드립니다...

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) 방법 중 어떤 방법이 빠를까요???

.

warpdory의 이미지

find . -name "*" -exec rm -rf {};

---------
귓가에 햇살을 받으며 석양까지 행복한 여행을...
웃으며 떠나갔던 것처럼 미소를 띠고 돌아와 마침내 평안하기를...
- 엘프의 인사, 드래곤 라자, 이영도

즐겁게 놀아보자.
http://akpil.egloos.com


---------
귓가에 햇살을 받으며 석양까지 행복한 여행을...
웃으며 떠나갔던 것처럼 미소를 띠고 돌아와 마침내 평안하기를...
- 엘프의 인사, 드래곤 라자, 이영도

즐겁게 놀아보자.

sephiron의 이미지

만약 디렉토리 전체를 지워도 된다면

# cd ..
# rm -rf logs/

해 보시고 잘 작동하는지 결과 좀 올려주세요. 궁금하네요.
ohmyfl의 이미지


1.......
find 문 안해봤지만,
안될거 같은데요...
rm -f * 하면 파일리스트 3만개 넘어가면 arg too long 에러 납니다...

2........
시스템 담당자에게 물었을때,
안된다고 한것 같습니다.
디렉토리 날리는것...(원인은 파일이 너무 많아서 디렉토리가 안날라가는것 같던데..)

그냥 쉘처럼 리스트 만들어서, 하나하나 지우는데...
서버에 부하있으면
10만개 날리는데... 10시간도 더걸리네요.... ㅠ.ㅠ

.
.

지원의 이미지

find 쓰면 될 것도 같은데요.
rm -f * 로 하면 안되는 이유는 아마도 실행이 되기 전에 shell 에서 *를 expand 우선 하고 나서 rm에게 인자를 넘겨주려고 하기 때문에 그런 것 같은데, "*"라고 하면 expand되지 않고 find에게 *를 argument로 넘겨줘서 find가 해석을 하니까, 될겁니다. (ls * 와 ls "*"의 차이...)

pung96의 이미지

1. find는 될것 같습니다. 저도 그렇게 하기 때문에..
find에 전체 리스트를 인자로 주는 것이 아니기 때문에 find -name "*" 와 ls *는 전혀 다른 상황입니다.
다만 저는 perl로 이것 과 같은 기능의 프로그램을 만들어 씁니다.(만든다기보다는 Perl Cookbook에 그냥 나와있죠)
훨씬 빠르거든요.

ironiris의 이미지

하나씩 지우면 시간이 좀 더 걸릴수 있으니
xargc 같은 프로그램을 사용하시면 도움이 될것 같네요. :)

ohmyfl의 이미지


find 로 하니까,
되는거 같네요....

워낙에 파일이 많아서, ls 만 쳐도 40분뒤에 뿌려집니다......
(부하 많을때는, 더 오래걸리고요... -_-;
서버는 IBM껀데, 대형사이트의 장비라서, 성능은 엄청난 서버일껍니다...)

그런데 문제는 속도입니다...
하루에 10만개도 못지운다면, 차라리 rm으로 하는게 나을테고...

음...
답변 주신분들 감사합니다...

(ps : 담당자가 깜박하고 로그 지우는걸 잊은건데, 로그파일이 백만개 쌓이니까,
대책이 없네요.... -_-;;;;;

그제는 십만개만 따로 스크립트로 만들어서 돌렸는데... 3시간 반 걸렸는데...
어제는 밤새 돌고 오늘 오후에 끝났네요...(스크립트를 2개 같이 돌렸기 때문에 더 느려진건지...알수가없네요...) )

pung96의 이미지

속도가 문제라면

스크립트를 써서 rm을 여러번 돌리지 말고 perl이나 Python, 혹은 c, c++ 등을 써서
지워보세요

전에 파일을 10000개 정도 만드는데 touch만드는 것과 Perl로 한번에 만드는 것이 30배 정도 속도 차이가 나더군요.

마잇의 이미지

rm *

이렇게 하면 *는 쉘에서 먼저 해석해서 확장시킨 후 rm을 그 결과와 함께 실행시킵니다.

그래서 말씀하신 것처럼

ksh: /usr/bin/rm: arg list too long

쉘에서(ksh) 오류 정보를 보여주는 것이죠.

해당 프로그램이 쉘에서 해석하는 특수문자(*와 같은)를 별도로 해석한다면 rm '*'와 같이 인용 처리 해줘야 합니다.

그래서 저도

find . -name "*" -exec rm -rf {};

이걸 해보시길 권합니다.

--
마잇


--
마잇

vecter의 이미지

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 -f

-n 붙여야 최대한 한번에 삭제하는것으로 알고 있습니다.

-------------------------------------------------------------------------------------------------------
Life ... http://iz4u.net/blog/

------------------------------------------------------------------------------------------------
Life is in 다즐링

윤용섭의 이미지

AIX에서는 디렉토리 파일이 많은 경우에는 위와 같은 에러가 나더군요

저는 그전에 echo 를 이용해서 해결했습니다.
rm `echo aaa*` 해보세요

무한포옹의 이미지

`echo ` 로 인자를 넘기나 aaa* 로 넘기나
같은 결과가 나오지 않을까요?

-------------------------------
== warning 대부분 틀린 얘기입니다 warning ===

윤용섭의 이미지

파일이 많을 때(몇 천개 이상) ls aaa* 하면 에러납니다.
그래서 편법으로 `echo aaa*` 한 겁니다.
경험에 의해서 말씀드린 것입니다.

무한포옹의 이미지

인자가 많은 경우는 어쩔 수 없습니다. 끊어서 넘겨줘야죠.
다음과 같이 해보세요.

for i in `seq 0 10000 990000` ;do
    seq_start=`expr $i + 0`
    seq_end=`expr $i + 9999`
    rm -f `seq -faaabbbccc%g $seq_start $seq_end`
done

일만 개씩 끊어서 rm에 인자로 넘깁니다.

find 로 1개씩 exec 하는 것보다는 낫지 않을까요?

-------------------------------
== warning 대부분 틀린 얘기입니다 warning ===

ydhoney의 이미지

예전에 영 귀찮아서

ls | tail -n 1000

이나, 혹은

ls | head -n 1000

뭐 요런식으로 특정갯수를 정해놓고 해당 리스팅되는 파일명을 변수로 받아서 삭제하는 스크립트를 짜서는 이것때문에 괜히 엄하게 시스템을 말아먹으면 안되니 중간에 가끔 sleep 60 이런식으로 쉬게 해주고는 계속 돌려뒀더랍니다. 뭐 중간중간 1분씩 쉬어도 나중에 보니까 금방 없어지고 그러더만요 -_- 한 몇천개단위쯤 지정해두고 해두면 꽤 편하게 잘 돌아갑니다. 시스템 부하량에 따라서 조절하면 되겠지요. 약간 시간은 걸려도 사용자가 손댈일은 별로 없고 그냥 냅두면 된다 라는게 참 좋습니다. =_=

또 하나의 간단한 방법은 hexedit를 이용하여 그냥 디렉토리를 통째로 날려버리는거지요 =_=;;

==
아 씨끄러 씨끄러~ 조용해!!
레드햇 9 이하 사용금지!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.