pip 모든 꾸러미 판올림.

tldr;

이게 답이다.

ppip3 list -o --user | awk '{if(NR>=3)print}' | cut -d' ' -f1 | xargs -n1 python3 -m pip install -U --user

예전에도 같은 내용에 대해 글을 쓴 적이 있었는데, 그 내용보단 이게 훨씬 낫다. (아래 내용에는 꽃삽질이 포함되어 있다. 최종 명령은 바로 위에 있고, 그를 찾기 위한 삽질기가 아래에 이어진다.)

이를 위한 몇몇 1행 명령(Oneliner)들을 찾을 수 있었는데, 그 중 가장 짧고(?) 괜찮아보이는 명령을 택했다.

다만, 원글을 쓴 이는 pip3 를 바로 실행했으나, 우분투에선 이게 살짝 문제가 될 수 있으므로, pip3 대신 python3 -m pip 을 실행하기로 한다.

또, 모든 Pip 꾸러미를 대상으로 하지 않고, 사용자가 설치한 꾸러미만을 판올림하도록 한다.

python3 -m pip list -o --user --format columns|  cut -d' ' -f1|xargs -n1 python3 -m pip install -U --user

** python3 -m pip 을 ppip3 로 Alias 화 하여 사용하고 있었는데, 위 명령에서 앞 부분은 ppip3 로 바꿔도 되지만, xargs 뒤는 ppip3 로 바꾸면 안된다. (sub shell 이 되어, export 가 불가능하다.)

???

그런데, 위 명령대로 하면 살짝 오류가 발생한다. pip list 의 결과를 3행부터 취해야만 하는데, 그에 대한 고려가 없어서 엉뚱한 결과를 보게 된다. (그렇다고 문제가 있지는 않지만, 그래도 불필요한 오류가 생기니 바로 잡는게 좋겠지?)
다른 명령을 찾아봤더니, 좀 더 복잡한 이런게 있었다. (미리 말하면, 아래 내용대로 넣으면 또 다른 오류가 발생한다.)

pip3 list -o | cut -f1 -d' ' | tr " " "\n" | awk '{if(NR>=3)print)' | cut -d' ' -f1 | xargs -n1 pip3 install -U


이참에 cut 과 tr awk 에 대해 간단한 설명을 덧붙여보도록 한다.

먼저, ppip3 list -o 의 결과는 다음과 같다.

ppip3 list -o --user | cut -f1 -d' '  

Package      Version Latest Type
------------ ------- ------ -----
ipython      7.18.0  7.19.0 wheel
jupyter-core 4.6.3   4.7.0  wheel

여기에서 필요한 부분은 첫번째 열인 Package 항목이므로, 여기만을 출력하게 할 때 cut 이 필요하다.
cut 에서 -f1 은 첫번째 열을 선택하라는 의미고, -d’ ‘ 은, 열 구분자로 공백(‘ ‘)을 쓰겠다는 뜻이 된다.

$ ppip3 list -o --user | cut -f1 -d' '  

Package
------------
ipython
jupyter-core

그런데, 여전히 불필요한 내용이 보인다. 첫째행과 둘째행, 즉 ‘Package’ 와, 그 아래 있는 점선. 이 두가지를 제외해야만하는데, 그때는 awk 의 힘을 빌려야 한다.

ppip3 list -o --user | cut -f1 -d' ' | awk '{if(NR>=3)print}'
ipython
jupyter-core

이러면 끝이다. 내가 인용한 원 명령에는 awk 부분 문법 오류가 있다.(뒤에 } 가 빠져있다.) 또, tr 도 사용했는데, 왜 사용했는지 의문. 그것도 두번이나 사용을 했는데..??

awk if 를 사용하여, 3행 이상(NR>=3)만 출력하도록 했다. 이제 마지막으로 판올림 명령만 붙여주면 된다.

ppip3 list -o --user | awk '{if(NR>=3)print}' | cut -d' ' -f1 | xargs -n1 python3 -m pip install -U --user

바로 위에서 한 것처럼, awk 와 cut 은 서로 바꿔줘도 아무런 상관이 없다. 속도 차는 날 수 있을 지언정.

이게 최종 명령이 되겠다.

혹시 사용하다가 tr 이 필요하게 되면 다시 정리해보기로 한다.
참고로, tr 에 대한 자세한 설명은 여기에 나와있다. 간단하게 생각해서, tr(translate)은, regex 의 substitute 와 유사하다. 즉, 앞에 있는 것을 뒤에 있는 것으로 바꾸라는 의미가 된다. tr " " "\n" 은 공백을 행바꿈문자로 변환하라는 뜻!

안녕하세요. 글 남겨주셔서 고맙습니다.