컴퓨터/자질구레 팁

Argument list too long이 나올 때

adnoctum 2012. 7. 24. 02:41

   rm 이나 scp 등의 명령어를 이용해서 뭔가를 하려 할 때 Argument list too long 라는 경고가 나오면서 실행이 되지 않는 경우가 있다. 예를 들면 다음과 같다. 


[adnoctum@nomadism chembl13_mol]$ rm *.mol

-bash: /bin/rm: Argument list too long


위 경고는 *.mol 파일이 너무 많은 경우 그 모든 파일을 rm 과 같은 명령어로 전달할 수 없기 때문에 발생하는데, 이것은 main 함수로 전달할 수 있는 인자의 수를 넘어갔기 때문에 발생하는 것으로 보인다. 어쨌든 이런 경우 원하는 작업을 하기 위해서는 find 와 exec 함수를 적절히 조합하여 사용한다. 예를 들면 다음과 같이. 


[adnoctum@nomadism chembl13_mol]$ find . -name '*.mol' -exec rm {} \;


자세한 내용은 find 의 설명을 참고한다. 만약 scp 의 경우라면 계속 암호를 물어볼 수 있는데, 접속 당할 컴퓨터에 접속할 컴퓨터의 key 를 지정해 놓으면 암호를 물어 보지 않으므로 그렇게 하도록 한다. 





위 에러 메세지의 원인을 좀 더 자세히 알아 보자. rm 이나 scp 등의 명령어가 작성되어 있는 함수의 main 함수에서 argument 의 개수를 int 로 받았을 경우 int 의 최대값에 의해 argument 의 수가 결정될 것이다. 즉, 


int main(int argc, const char* argv[])

{



많은 함수는 위와 같은 골격을 갖고, 우리가 rm 1.txt 2.txt 로 실행을 시키면 rm 으로 컴파일 된 main 함수의 argc 는 인자의 개수인 3이, argv에는 인자인 rm, 1.txt, 2.txt 가 들어 가게 되는 것이다. (실행시킨 명령어 자체도 인자에 포함이 되기 때문에 rm 이란 키워드 자체도 argc 에서 count 가 되고, argv[0] 이 rm 이다). 그런데 int argc 에서 보듯이 argc 를 int 로 해버리면 넘길 수 있는 인자의 최대 개수가 integer 형의 최대값이 되는 것이다. 만약 이 값을 넘는 개수를 인자로 넘기면 에러가 나겠지. 


그런데 find 함수는 인자 목록을 만드는 것이 아니라, 파일들을 하나씩 순회하면서 그 때마다 -exec 로 넣어 준 명령어를 실행시키게 된다. 그렇기 때문에 rm과 같은 명령어에서 나던 argument is too long 이 find 로 엮어서 실행을 시킬 때는 나지 않는 것이다, 아마도.