RPM 패키지 무더기 설치법 & 삭제법
xfce4 설치하다가 문득 생각난 거라서 적습니다.
xfce4 rpm 패키지를 받아보면 조금 맛이 갑니다. rpm 패키지가 여러개가 무더기로 있기때문에, 의존성 따져가면서 패키지를 순서대로 설치하려면 골치가 아픕니다. 설치는 그런대로 억지로 한다고 치더라도 나중에 이거 다 지우려면 역시 골치가 아프죠 ㅡㅡ;;
① RPM 패키지 무더기 설치법
일단 RPM 무더기를 임의의 디렉토리에 풀어놓습니다. xfce4-4.0.2 버전이라면 RPM 파일만 25개던가 그럴 겁니다 ㅡ_ㅡ;; su 명령을 쓰거나, root 로 접속한 상태에서 상태에서 다음과 같이 입력합니다.
for X in * ; do rpm -Uvh $X ; done
일단 이렇게 입력하면 모든 rpm 파일들에 대해 하나씩 넘어가면서 rpm -Uvh 명령이 실행됩니다. 예를 들어 패키지 이름이 1.rpm / 2.rpm / 3.rpm/ ... 이런 식이라면 연속으로
rpm -Uvh 1.rpm
rpm -Uvh 2.rpm
rpm -Uvh 3.rpm
...
이렇게 실행됩니다. 그러면 의존성 문제 때문에 오류가 뜨고 설치가 안되지만, 일부 패키지는 설치가 됩니다. 그럼 다시 ↑ 키를 눌러서 명령을 불러내서 다시 "for X in * ; do rpm -Uvh $X ; done" 명령을 실행시킵니다. 이런 식으로 몇번 반복하면 의존성 오류 메시지가 더 이상 안뜨게 됩니다. 이로써 모든 패키지 설치완료입니다 ^^
★★ 역주 ★★
이건 리눅스에서 자주 사용되는 반복 명령어 스크립트인데, 응용해서 써먹을 곳이 아주 많으니 외워두셔도 됩니다. rar 이나 bdftopcf 등으로 무더기 처리하기 등, 정말 많이 쓰입니다. 약간만 설명을 하면,
for X in 파일명지정
지정한 파일들을 X 변수로 쓴다는 의미. 변수명은 $X 가 됩니다. 조금 고급단계로 지정한 파일들의 확장자만 바꿀 경우에는 $(basenaem $X.확장자) 이런 형태로 쓰면 됩니다.
do 실행명령 $X
실행명령에 사용하고 싶은 명령넣으면 됩니다. do rpm -Uvh $X 라든가 do rar a $(basename $X.rar) $X 라든가 하여간 그런 식으로 때려넣으면 됩니다.
done
처리하라는 최종 명령
각각의 파일들에 대해서 동일한 명령을 실행하게 됩니다. 예를 들어 1.iso / 2. iso / 3. iso / ... 이런 식으로 iso 파일이 100개가 있는데, 모두 rar 로 압축을 하고 싶다고 가정하죠. 그럼 이렇게 입력하면 됩니다.
for X in * ; do rar a $(basename $X.rar) $X ; done
그러면 1.iso 를 압축해서 1.iso.rar 파일이 생성되고, 2.iso 를 압축해서 2.iso.rar 파일이 생성되고, 3.iso 를 압축해서 3.iso.rar 파일이 생성되고... 뭐 이런 식으로 100번째 파일까지 모두 다 처리됩니다. 상당히 유용합니다. 외워두실 것을 강력 추천합니다.
★★★★★
② RPM 패키지 무더기 제거법
이것도 설치방법이랑 비슷하게 처리하면 되는데, 약간 손을 봐줘야할 것이 있습니다. rpm -qa 명령으로 설치된 rpm 패키지를 조회해보면, 풀어놓은 rpm 패키지에서 뒷부분 이름이 다른 것을 알 수 있습니다. 'i386.rpm' 같은 확장자가 빠져 있죠.
xfce4 를 무더기로 제거할 경우를 예로 들어보겠습니다. 임의의 디렉토리를 만들고, 거기에 rpm 무더기를 풀어놓습니다. 설치된 rpm 패키지랑 비교를 해보면, 뒷부분만 약간 다릅니다. 끝부분이 'rh9-i386.rpm' 인 파일이랑 'rh9-noarch.rpm' 이던가 그렇습니다. 그럼 이부분을 제거해줘야 합니다.
rename rh9-i386.rpm "" *.rpm (엔터)
rename rh9-noarch.rpm "" *.rpm (엔터)
(rename 대상문자 바꿀문자 대상파일)
이렇게 입력하면 rh9-i386.rpm, rh9-noarch.rpm 부분이 모두 공백으로 바뀝니다. 위 명령은 모든 rpm 파일들(*.rpm) 을 rh9-i386.rpm 이 들어간 부분을 찾아서 모두 ""(큰 따옴표 두개, 공백이란 뜻) 으로 바꾸라는 의미입니다.
일단 이렇게 바꾼 상태에서는 아까랑 비슷하게 명령을 주면 됩니다. 제거니까 -Uvh 대신에 -e 를 쓰면 되겠죠.
for X in * ; do rpm -e $X ; done
이렇게 입력하면 각각의 파일에 대해서 제거시도를 하는데, 의존성 오류가 발생하지 않는 놈은 제거되고, 의존성 오류가 발생하는 놈은 그냥 남습니다. 그럼 다시 ↑ 키로 "for X in * ; do rpm -e $X ; done" 명령을 다시 불러내서 반복 실행시킵니다. 이렇게 몽땅 설치오류 메시지가 나올때까지 반복합니다. 이로써 깨끗하게 rpm 무더기가 제거되었습니다. rpm 패키지를 풀어놓았던 임의의 디렉토리를 지워버리면 끝입니다 ^^
apt-rpm이나 yum을 써보세요.rpm 의존성 고민을 많이 덜
apt-rpm이나 yum을 써보세요.
rpm 의존성 고민을 많이 덜어 주더군요.
필요한 rpm 꾸러미를 한데 모아 놓았다면,그냥 rpm -Uvh *이
필요한 rpm 꾸러미를 한데 모아 놓았다면,
그냥 rpm -Uvh *이 낫지 않습니까?
필요한게 다 모였다면 한 번에 끝나고,
빠진게 있다면 그것만 넣어서 다시 rpm -Uvh *
rpm이 알아서 의존성을 엮어보고 잘 되면 깔아줄텐데요.
왜 for를 동원해 여러번 돌려야 하나요?
ㄲ ㅏ ㅂ ㅣ / M c K a b i / 7 7 r b i / T o D y
설치할 때는 rpm -Uvh * 가지고 해결이 되지만, 문제는 지울 때라
설치할 때는 rpm -Uvh * 가지고 해결이 되지만, 문제는 지울 때라서요. 지울 때는 rpm -qa 로 각각의 패키지 조회해서 지우기가 뭣합니다. 확실히 설치할 때는 그냥 rpm -Uvh * 해서 반복하는 방법이 훨 낫겠군요.
(rpm 명령에 대표문자가 먹는다는 사실을 순간 망각했던 ^^;; )
그러나 지울 때는 그 방법이 안되죠. rpm -e * 한다고 해서 지워지는 것은 아니거든요. 리눅스 계열은 꽤 많은 명령에서 대표문자가 먹지 않습니다. 이런 경우에 for 는 꽤 유용해서 겸사겸사 적었다고 생각해주시길 ㅡㅡ;;
[quote="CY71"]설치할 때는 rpm -Uvh * 가지고 해결이
이름 바꿀 때, .rpm 까지 없애고 '\ls -1 | rpm -e' 이렇게 하면 되겠죠? :D
"no error was found with his codes"
파이프 사용이라... 생각해보니 그런 방법도 있었군요. 그러나 해보니까
파이프 사용이라... 생각해보니 그런 방법도 있었군요. 그러나 해보니까 안되는군요. 상식적으로 생각하면 될 것도 같은데...
ls -1 | rpm -e
ls -1 | rpm -e -
둘 다 안됩니다. 그런데 곰곰히 생각해보니까 안되는게 당연한 것 같군요. ls, rpm, 파이프 모두 단발성 명령 아닌가요? 그러면 반복해서 실행은 안되는게 맞는 것 같기도 한데...
ls -1
이 명령에서 나온 결과는 파일들이 주르륵 출력되는 것인데... 파이프를 통해서 rpm 에게 전달되어야하는 것은 파일 이름 한개 잖습니까. 그러면 rpm 이 명령을 처리할 수 없겠죠.
명령 : ls -l
결과 :
xfce-4.0.2
xfce-utils
...
rpm -e 가 받아들이는 것은 xfce-4.0.2 같은 한줄이어야하는데, 파이프를 통해서 주르륵 리스트가 넘어와서는 처리가 안되겠네요.
파이프는 앞쪽의 표준 출력(ls를 실행했을 때 화면에 나오는 것)을 뒤쪽
파이프는 앞쪽의 표준 출력(ls를 실행했을 때 화면에 나오는 것)을 뒤쪽의 표준 입력(rpm을 실행할 때 키보드로 입력하는 것)으로 바꿉니다. rpm은 키보드로 입력을 받지 않으니 영향이 없네요.
이럴 경우에는 xargs를 써 보세요.
ls -1 | xargs -n 1 rpm -e
----
It is essential, if man is not to be compelled to have recourse, as a last resort, to rebellion against tyranny and oppression, that human rights should be protected by the rule of law.
[Universal Declaration of Human Rights]
rpm으로 깔거나 지울 때 여러 꾸러미가 걸리고 목록이 확실하게 있다면,
rpm으로 깔거나 지울 때 여러 꾸러미가 걸리고 목록이 확실하게 있다면, 명령을 반복해서 내리는게 아니라 한꺼번에 rpm으로 넘겨주는게 좋습니다. rpm이 넘어온 꾸러미를 모두 검사한 뒤 의존성을 계산해 처리하죠.
ㄲ ㅏ ㅂ ㅣ / M c K a b i / 7 7 r b i / T o D y
[quote="CY71"]설치할 때는 rpm -Uvh * 가지고 해결이
wildcard(대표문자?) 문자는 쉘이 처리하는 것입니다.
먹고 안먹고 하는 명령이 있을리가 없죠.
꽤 많은 명령에서 먹지 않는게 아니라, 파일명을 인자로 받지 않은 뿐이죠. 패키지명을 인자로 받으니... 파일명을 다 리스트해주고, sed로 걸러서 패키지명만 남긴 후 그것을 인자로 넘겨주면 되겠네요.
Re: RPM 패키지 무더기 설치법 & 삭제법
앞의분도 지적해주셨지만,
$ rpm -Uvh *.rpm
하면 될 것을 상당히 복잡하게 하네요 ;;
이렇게 하면 반복해서 안해도 의존성 검사해서 한번에 됩니다.
rpm이 여러개를 한번에 받으면 내부적으로 의존성을 따져서 설치하기 때문에.
뭘 번역했다는 것인지 --;;
쉘스크립트 잘 사용하면 정말 편하다는 것은 물론 동의합니다 :)
많이 쓰다보면 자연히 외워지겠죠.
쉘의 for문을 이용하기 위해 파일이름을 다 바꿔버린다는 것은 너무 가혹하다고 생각하지 않으십니까? :cry:
rpm 패키지 파일 이름에서 얼마나 떼야 패키지명만 남는지는 현재 래드햇을 사용하지 않아 확실히 알 수 없으나, 전글에서도 밝혔지만 sed를 filter로 사용하면 파일 이름 안바꿔도 할 수 있습니다. 간단히 방법을 밝히면,
$ rpm -e $(find . -name "*.rpm" | sed -e 's/\.어쩌고\.rpm/')
이런 식으로 하면 될것 같네요.
이것 역시 rpm이 여러 패키지 이름을 한번에 받으니까 하나하나 rpm을 따로 실행시키는것보다 이렇게 한번에 넘겨주는 것이 빠르겠죠. 의존성 에러도 덜나고.
쉘과 여러가지 툴에 대해서 조금만 더 알아보면 좋을 것 같습니다 :)
[quote="CY71"]파이프 사용이라... 생각해보니 그런 방법도 있
상삭적으로 생각하면 안될거 같습니다...
rpm을 패키지명을 표준입력으로 받는게 아니니까요 :)
안되는 이유는 좀전에 말했지만, ls가 여러줄을 뿌리기 때문이 아닙니다.
$ ls -1 | rpm -e
이것을 동작을 기대하는 것으로 고치면
$ rpm -e $(ls -1)
가 되겠는데, 이렇게 하면 ls가 여러줄로 출력을 하더라도 어차피 whitespace로 구분하는 것이기 때문에 상관없이 됩니다.
그런데, 인자로 파일명을 원할때는 ls를 쓰는것보다 find를 쓰는 것이 좋습니다. 아무래도 ls가 user friendly한 출력을 해주는 명령이라면, find는 좀 더 이런 상황에 쓰기 적합한 명령입니다.
물론 파일 이름을 안바꾸고 하려면 제가 위에 올린 글에 있는 것처럼 해야겠지요 :)
[quote="eungkyu"][code:1]$ ls -1 | rpm -
그렇게 해야 작동하는군요.. 생각해보니 echo 를 쓰는 것도 나쁘지 않겠습니다 :)
rpm -e $(echo *)
근데 실질적으로 파일명을 일일이 고치거나 다시 만드는 작업은 피하는게 좋을 것 같네요.
"no error was found with his codes"
댓글 달기