반응형

출처

https://www.baeldung.com/linux/redirect-output-of-running-process

이미 실행중인 프로세스의 출력을 redirecting 하기

1. 소개

Linux에서 작업할 때 redirections을 사용하는 것은 매우 일반적입니다. 예를 들어, 프로그램을 실행할 수 있고 실행시 생성되는 출력을 침묵시킬 수 있습니다. 그러나 bash는 프로세스가 실행되면 출력을 redirection 하는 직접적인 방법을 제공하지 않습니다. 따라서 이 글에서는 실행중인 프로세스의 출력을 리디렉션하거나 복사하는 다양한 방법에 대해 알아 봅니다. 예를 들어 프로그램을 실행할 때 출력을 리디렉션하는 것을 잊은 경우 유용 할 수 있습니다.

이를 위해 첫 번째는 gdb를 사용하고 다른 하나는 strace를 사용하며 마지막으로 세 번째는 screen을 사용하는 세 가지 방법을 살펴 보겠습니다. 세 번째 접근 방식은 약간 다릅니다.

2. 출력을 redirect하기 위해 gdb 사용하기

gdb_는 리눅스에서 코드 디버깅을 위한 강력한 도구입니다. 그리고 우리는 실행 중인 프로세스에서 코드를 실행하기 위해 그것을 사용할 수 있습니다. 이 경우, *_우리는 실행 중인 프로세스로 _gdb_에 접근(attach)하여 출력을 redirect하기 위해 *gdb 사용할 것이며 작업을 마쳤을 때 실행중인 프로세서로부터 분리(detach)할 것입니다.**

출력을 redirect하기 위해 우리가 할 수 있는 방법은 현재 파일 descriptor를 닫고 그것을 새로운 출력을 가리키도록 다시 여는 것입니다. 우리는 opendup2 함수를 사용하여 이를 할 것입니다.

유닉스 시스템에는 2개의 기본 출력이 있는데, 표준출력*과 *표준에러 입니다. _표준출력_은 파일 descriptor 1과 관련되어 있고 _표준에러_는 파일 descriptor 2와 관련되어 있습니다. 예를 들어, 표준 출력을 redirect하기 원하면 우리는 파일 descriptor 1에서 활동할 필요가 있습니다.

우리는 PID 14560인 프로세스의 출력을 redirect하기 원한다고 가정합시다. 우리는 그 PID로 _gdb_를 접근함으로써 시작해야 합니다.

$ gdb -p 14560

프로세스로 접근했을 때 우리는 파일 descriptor 1을 /tmp/process_stdout로 redirect할 수 있습니다.

(gdb) p dup2(open("/tmp/process_stdout", 1089, 0777), 1)

우리는 숫자 1089를 사용했는데 이는 _O_WRONY | O_CREAT | O_APPEND_를 표현하기 때문이라는 것을 참고하세요.

우리는 표준 출력도 같은 방법으로 파일 descriptor 2를 사용함으로써 정확하게 redirect할 수 있습니다.

(gdb) p dup2(open("/tmp/process_stderr", 1089, 0777), 2)

이 시점에서 출력이 redirect 되었습니다. 그러나 프로세스가 중지되고 _gdb_가 그 프로세스에 접근(attach)합니다.

더 이상 gdb가 필요하지 않으므로 프로세스에서 분리하고 _gdb_를 종료할 수 있습니다. 이렇게하면 프로세스가 계속 실행됩니다.

(gdb) q

또는 /dev/null로 redirect 하여 출력을 침묵시킬 수 있습니다.

(gdb) p dup2(open("/dev/null"), 1)

우리는 모든 gdb 명령을 "명령 파일"로 작성할 수 있고 파라미터 -x 를 사용하여 그것을 실행할 수 있습니다.
gdb_redirect 라 불리는 파일을 생성합시다.

p dup2(open("/tmp/process_stdout", 1089, 0777), 1)
p dup2(open("/tmp/process_stderr", 1089, 0777), 2)
q

다음 우리의 파일 _gdb_redirect_를 사용하여 _gdb_를 실행하면 됩니다.

$ gdb -p 14560 -x gdb_redirect

3. 모든 쓰기 호출을 검사하는 strace 사용하기

우리는 시스템 콜(호출)을 검사하는 strace를 사용할 수도 있습니다. 이 방법은 원래 출력을 중단하지 않습니다. 대신 다른 위치로 복사합니다.
PID 14560의 표준 오류로 쓰는 모든 쓰기를 검사합시다.

$ strace -etrace=write -s 100000 -p 14560 2>&1 | grep --line-buffered '^write(2,'
write(2, "\r", 1)                       = 1
write(2, "17243001856 bytes (17 GB, 16 GiB) copied, 1185 s, 14.6 MB/s", 59) = 59
write(2, "\r", 1)                       = 1
write(2, "17249965568 bytes (17 GB, 16 GiB) copied, 1186 s, 14.5 MB/s", 59) = 59

이 파라미터로 strace*는 *쓰기 호출과 최대 문자열 크기를 10만으로 설정하여 PID 14560에 접근합니다. 그리고 우리는 파일 descriptor 2로 쓰는 것만 출력하기 위해 grep 으로 사용합니다.
우리는 /tmp/process_stderr라 불리는 파일로 이를 redirect할 수 있습니다.

$ strace -etrace=write -s 100000 -p 14560 2>&1 | grep --line-buffered '^write(2,' > /tmp/process_stderr

만약 strace 출력 포멧을 좋아하지 않는다면 문자열만 출력하기 위해 sed를 사용할 수 있습니다.

$ strace -etrace=write -s 100000 -p 14560 2>&1 | sed -n -r 's/^write\(2,\s*"(.+)",\s*[[:digit:]]+\)\s*=\s*[[:digit:]]+$/\1/p'
\r
25754656256 bytes (26 GB, 24 GiB) copied, 1710 s, 15.1 MB/s
\r
25761747456 bytes (26 GB, 24 GiB) copied, 1711 s, 15.1 MB/s

또한 ** strace는 16진수와 파일 descriptor로 쓰여진 아스키코드로 출력할 수 있습니다.** 우리는 이를 -ewrite=fd 옵션을 사용하여 할 수 있습니다.

$ strace -ewrite=2 -etrace=write -p 14560 2>&1 | grep  --line-buffered '^ |'
 | 00000  0d                                                .                |
 | 00000  33 33 30 31 32 30 32 37  39 30 34 20 62 79 74 65  33012027904 byte |
 | 00010  73 20 28 33 33 20 47 42  2c 20 33 31 20 47 69 42  s (33 GB, 31 GiB |
 | 00020  29 20 63 6f 70 69 65 64  2c 20 32 31 36 32 20 73  ) copied, 2162 s |
 | 00030  2c 20 31 35 2e 33 20 4d  42 2f 73                 , 15.3 MB/s      |
 | 00000  0d                                                .                |
 | 00000  33 33 30 31 39 36 32 31  38 38 38 20 62 79 74 65  33019621888 byte |
 | 00010  73 20 28 33 33 20 47 42  2c 20 33 31 20 47 69 42  s (33 GB, 31 GiB |
 | 00020  29 20 63 6f 70 69 65 64  2c 20 32 31 36 33 20 73  ) copied, 2163 s |
 | 00030  2c 20 31 35 2e 33 20 4d  42 2f 73                 , 15.3 MB/s      |

4. screen을 사용하여 파일에 출력 쓰기

프로세스가 스크린 세션 내에서 실행 중인 경우 현재 창을 파일에 기록할 수 있습니다. strace와 마찬가지로 출력을 대체하지 않고 대신 복사합니다. 그러나 임의의 파일 descriptor를 복사 할 수 없습니다. 화면 창에 기록 중인 내용만 복사할 수 있습니다.

이를 위해 screen 명령 로그 또는 핫키 C-a H를 사용합니다. 그러면 화면 창 번호가 n 인 screenlog.n이라는 파일에 로깅이 활성화됩니다. 그런 다음 화면에서 분리하여 프로세스를 실행하면 screenlog.n에서 출력을 볼 수 있습니다. log 명령이나 핫키를 다시 사용하여 언제든지 로그인을 중지 할 수 있습니다.

또한 logfile 명령을 사용하여 출력을 작성할 위치를 지정할 수 있습니다.

:logfile process_output

그런 다음 log를 실행하면 출력이 screenlog.n 대신 process_output에 표시됩니다.

동영상 링크

5. 결론

이 글에서는 이미 실행중인 프로세스의 출력을 redirect 하는 세 가지 방법을 살펴 보았습니다.

먼저 gdb를 사용하여 현재 출력을 새 출력으로 대체했습니다. 그런 다음 *strace로 *쓰기 위한 모든 호출을 가로 채서 원하는 출력을 다른 위치에 복사했습니다. 마지막으로 창을 파일에 기록하는 screen을 활용했습니다.

반응형
반응형

출처 : https://superuser.com/questions/403800/how-can-i-make-the-bash-backtick-operator-keep-newlines-in-output

bash backtick() 연산자로 출력의 개행을 어떻게 유지할 수 있을까요?

backtick() 치환에 bash가 개행 문자를 먹지 않도록 하는 방법이 있습니까?

예를 들면

var=`echo line one && echo line two`
echo $var

line one line two

하지만 제가 원하는 것은 다음과 같습니다.

var=`echo line one && echo line two` # plus some magic
echo $var

line one
line two

3개의 답변 중 1개를 추려냄

이는 backtick() 치환 문제가 아닌 echo의 문제입니다. 제어 문자가 작동하려면 변수에 따옴표를 사용해야 합니다.

$ var=`echo line one && echo line two`
$ echo "$var"
line one
line two
반응형
반응형

출처 : https://stackoverflow.com/questions/13983365/grep-from-tar-gz-without-extracting-faster-one

압축해제 없이 tar.gz 파일을 grep 하기 [빠른 방법]

10여개의 .tar.gz 파일로부터 grep 패턴을 시도하였지만 매우 느립니다.
제가 사용한 내용입니다.

tar -ztf file.tar.gz | while read FILENAME
do
        if tar -zxf file.tar.gz "$FILENAME" -O | grep "string" > /dev/null
        then
                echo "$FILENAME contains string"
        fi
done

8개의 답변 중 1개를 추려냄

zgrep이 있다면 다음처럼 사용할 수 있습니다.

zgrep -a string file.tar.gz
반응형
반응형

출처 : https://stackoverflow.com/questions/4936807/how-to-do-ssh-with-a-timeout-in-a-script

script에서 ssh로 timeout을 주는 방법?

저는 원격 호스트로 비밀번호 없는 SSH로 접속하는 script를 실행하고 있습니다. 만약 원격호스트가 실행하는데 무한의 시간이 걸린다면 저는 timeout을 설정하여 그 ssh 세션을 빠져나와 저의 sh script에서 다음 행을 진행하고 싶습니다.

timeout을 어떻게 설정할 수 있나요?


6개의 답변 중 1개의 답변

ssh -o ConnectTimeout=10  <hostName>

10은 초로 된 시간을 의미합니다. 이 timeout은 연셜 생성에만 적용됩니다.

반응형
반응형

출처 : https://www.shellscript.sh/tips/getopts/

Shell Script 튜토리얼 - 팁 Getopts

명령줄 인자 파싱하기

대부분의 Unix, Linux 명령은 "마이너스" 심볼을 앞에 붙여 옵션을 사용합니다. 예를 들어 파일 목록을 긴 포멧으로, (역순으로) 시간순으로 정렬할 때 당신은 ls -l -r -t를 사용하거나 ls -lrt를 사용할 수 있습니다.
몇가지 명령은 인자를 가지는데, 당신은 "myfiles" 디렉터리를 "mytarfile.tar"로 압축할 수 있습니다. tar -c의 경우, 압축 하기 위해 파일 목록을 취하는 옵션이 오게 됩니다.

The tl;dr lowdown

여기에 "너무 길어 읽지 않았다"처럼 빠른 개요가 있습니다. 다음처럼 getopts를 사용할 수 있습니다.

while getopts 'srd:f:' c
do
  case $c in
    s) ACTION=SAVE ;;
    r) ACTION=RESTORE ;;
    d) DB_DUMP=$OPTARG ;;
    f) TARBALL=$OPTARG ;;
  esac
done

간단한 "-f" 형식 대신 "--filename"과 같은 긴 형식 인수를 구문 분석하는 외부 유틸리티 getopt도 있습니다. 당신도 그 게시물을 읽고 싶을 것입니다.

그렇습니다. 바쁜 사람들은 위 예시에 만족할 것이며 getopts가 무엇인지 어떻게 작동하는지와 당신의 스크립트에서 어떻게 유용하게 사용할 수 있는지 알아보겠습니다.

getopts 소개

당신을 위해 이 옵션들을 파싱하는 편리한 유틸리티를 getops라 부릅니다. 그 사용법은 조금 이상하게 느껴지지만, 이 기술은 당신의 스크립트가 옵션을 표준화되고 친근하게 느끼는 방법으로 처리하도록 합니다..

getopts를 통해 당신이 전달한 첫번째 인자는 그것이 받아들일 어떤 문자(혹은 숫자, 또는 다른 한개의 글자))의 목록입니다. 각 글자 뒤에 colon(:)는 tar -f mytarfile 처럼 인자가 따라온다는 의미입니다. tar -f는 tar 파일의 이름이 항상 따라와야 합니다. 이 옵션 인자는 $OPTARG 변수에서 당신의 스크립트로 보내집니다.

getopts$OPTIND 변수도 세팅하는데 나중에 다룰 것입니다.

당신이 getopts로 전달하는 두번째 인자는 현재 switch의 문자가 위치하게 될 변수의 이름입니다. 주로 이는 opt 또는 c로 불리며, 아무 이름으로 올 수 있습니다.

이 예시 스크립트는 tarball로 파일을 저장하고 복구할 수 있습니다. 당신은 그것에 -s(저장) 또는 -r(복구)로 그것에 전달해야 합니다. 만약 당신이 -d databasefile을 전달하면 데이터베이스를 덤프(또는 복구)하는 이름으로 사용될 것입니다. 만약 -f tarball을 전달하면 파일을 생성(또는 해제하는) tarball의 이름으로 사용될 것입니다.

이 첫 번째 스크립트 초안에서 다루지 않는 몇 가지 사항이 있습니다. -s-r을 모두 전달하는 것은 유효하지 않습니다. 그렇게 하면 이 스크립트는 마지막으로 전달한 것을 취하므로 dbdump.sh -s -r -d 또는 dbdump.bin -s -r -s는 마지막으로 처리 한 것이 저장 명령이므로 (복원하지 않고) 저장합니다.

마찬가지로 -d-f 중 하나 이상을 전달하지 않으면 아무 일도 일어나지 않습니다.

DB_DUMP TARBALL ACTION 설정이 안되는 이유는 스크립트가 이미 설정된 환경 변수의 영향을 받지 않기 때문입니다. 이는 실행중인 스크립트의 범위에만 영향을 미칩니다. 호출 쉘은 변수가 변경되지 않습니다.

간결하게하기 위해 여기서 save_database(), save_files(), restore_database()restore_files() 함수를 정의하지 않았습니다. 다운로드 가능한 스크립트에는 더미 기능이 있어 스크립트가 실제로 실행됩니다. 수행할 작업만 표시하지만 실제로는 파일에 아무런 작업을 수행하지 않습니다.

이 스크립트 다운로드(getops1.sh)

#!/bin/bash

unset DB_DUMP TARBALL ACTION

while getopts 'srd:f:' c
do
  case $c in
    s) ACTION=SAVE ;;
    r) ACTION=RESTORE ;;
    d) DB_DUMP=$OPTARG ;;
    f) TARBALL=$OPTARG ;;
  esac
done

if [ -n "$DB_DUMP" ]; then
  case $ACTION in
    SAVE)    save_database $DB_DUMP    ;;
    RESTORE) restore_database $DB_DUMP ;;
  esac
fi

if [ -n "$TARBALL" ]; then
  case $ACTION in
    SAVE)    save_files $TARBALL    ;;
    RESTORE) restore_files $TARBALL ;;
  esac
fi

getopts 명령은 while 루프에 대한 인수입니다. 루프를 통해 매번 switch를 처리하고 $c 변수를 switch의 문자로 설정합니다. 기본 튜토리얼에서 루프case에 대해 자세히 읽을 수 있습니다.

이 스크립트를 dbdump.sh -s -r -d /tmp/dbdump.bin -f /tmp/files.tar -s로 호출하면 -s를 처리하고 $c=s를 설정하고 처음으로 case`` 구문을 실행합니다.$c=s$ACTION=SAVE를 설정하고 그 줄의 끝에는 처리를 중지하라고 알려주고 while 루프 주위의 다음 실행을 위해 getopts로 돌아갑니다. 논리적으로 의미가 없는 -r을 읽지만 (백업을 저장하고 동시에 백업을 복원 할 수는 없지만) 스크립트는 이를 알지 못하므로$c=r을 설정합니다. case 문은$ACTION = RESTORE를 설정하고 다음 인수를 처리하기 위해getopts`로 돌아갑니다.

이제 getopts는 $c=d를 설정하고 $OPTARG = /tmp/dbdump.bin 도 설정합니다. getopts 호출에서 'd:는 -d 다음에 인수 (데이터베이스 덤프 파일의 이름)가 옵니다. 실행은 case 문으로 진행하여 $DBDUMP=/tmp/dbdump.bin을 설정합니다. 스크립트의 본문에 들어갈 때 $ DBDUMP 변수에 값이 있으면 데이터베이스를 해당 파일에 저장하거나 해당 파일에서 복원합니다.

다음 옵션은 -f /tmp/files.tar 이며 동일한 프로세스가 수행됩니다. getopts는 $c=f 를 설정하고 $OPTARG=/tmp/files.tar도 설정합니다. case 문은 이것을 읽고 $TARBALL=/tmp/files.tar를 설정합니다.

마지막으로 또 다른 -s 스위치를 전달하여 $ACTION 변수를 다시 SAVE로 변경합니다.

기본 스크립트가 시작되면 $DB_DUMP가 설정되어 있는지 확인한 다음 $ACTION 값을 확인하고 $ACTION 값에 따라 $DB_DUMP를 사용하여 데이터베이스를 저장하거나 복원합니다.

마찬가지로 $TARBALL이 설정되어 있는지 확인하고 $TARBALL을 인수로 사용하여 파일을 저장하거나 복원합니다.

반응형
반응형

CentOS6에서 gradle을 설치할 일이 있어서 다음 주소들을 참고하여 shell 스크립트를 만들었습니다 :)
참고

Gradle 설치

  • install-gradle-centos.sh
    • root 계정에서 다음 스크립트를 실행하여 설치하였습니다.
# installs to /opt/gradle
# existing versions are not overwritten/deleted
# seamless upgrades/downgrades
# $GRADLE_HOME points to latest *installed* (not released)
gradle_version=3.4.1
wget -N https://services.gradle.org/distributions/gradle-${gradle_version}-all.zip
unzip gradle-${gradle_version}-all.zip -d /opt/gradle
ln -sfn gradle-${gradle_version} /opt/gradle/latest
printf "export GRADLE_HOME=/opt/gradle/latest\nexport PATH=\$PATH:\$GRADLE_HOME/bin" > /etc/profile.d/gradle.sh
. /etc/profile.d/gradle.sh
# check installation
gradle -v
반응형
반응형

출처

https://stackoverflow.com/questions/10856447/sed-command-find-and-replace-in-even-lines-of-a-file


sed에서 파일의 짝수 줄만 찾아 치환하는 명령

저는 이 stackoverflow에서 신입입니다. 저는 SED를 사용하여 파일의 짝수 줄만 표현식으로 치환하고 싶습니다. 제 문제는 원래 파일의 변화는 원래 파일에서 변한 내용을 저장하는 방법을 생각할 수 없다는 점입니다. (예: 파일에서 변한 내용을 덮어쓰는 방법) 저는 다음을 시도해 보았습니다.

sed -n 'n;p;' filename | sed 's/aaa/bbb/'

하지만 이는 변한 내용을 저장할 수 없습니다. 이에 대한 당신의 도움에 감사드립니다.

------

4개의 답변 중 1 개의 답변만 추려냄.

다음을 시도하세요.

sed -i '2~2 s/aaa/bbb/' filename

-i 옵션은 sed에게 해당 filename에서 작동하도록 표준출력(stdout)으로 수정된 버전을 쓰지 않고 즉 원래 파일을 나두지 않고 파일의 변경 내용을 적용하도록 합니다. 2~2부분은 명령어를 통해 적용되어야 할 sed의 줄(라인)에 대한 주소입니다. 2~2는 짝수 줄만 편집(수정)함을 의미합니다. 1~2는 홀수 줄만 편집(수정)함을 의미합니다. 5~6는 6줄마다 편집(수정)하고 5번째 줄부터 시작합니다.

-- 역자 추가 내용--

참고주소

https://www.gnu.org/software/sed/manual/html_node/Addresses.html


반응형
반응형

출처 : https://stackoverflow.com/questions/4585929/how-to-use-cp-command-to-exclude-a-specific-directory

특정 디렉터리를 제외하고 'cp' 명령 사용하는 방법

저는 특정 하위 디렉터리(sub-directory)에서 몇 개의 파일을 제외하고 그 디렉터리의 모든 파일을 복사하고 싶습니다. 저는 cp 명령어는 --exclude 옵션이 없는 것을 알게 되었습니다. 이를 어떻게 할 수 있을까요?

19개 답변 중 1개

rsync는 빠르고 쉽습니다.

rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude
rsync -av --progress 원본폴더 /대상폴더 --exclude 제외할폴더

당신은 --exclude를 여러번 사용할 수 있습니다.

rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude --exclude anotherfoldertoexclude
rsync -av --progress 원본폴더 /대상폴더 --exclude 제외할폴더 --exclude 또다른제외할폴더

--exclude 뒤의 폴더에 thefoldertoexclude 디렉터리는 sourcefolder, 즉 sourcefolder / thefoldertoexclude와 관련이 있습니다.

또한 실제 명령을 실행하기 전에 무엇이 복사되는 지 보기만 하려면 -n을 추가할 수 있고 괜찮다면 명령줄에서 -n을 제거하면 됩니다.

반응형
반응형

출처 : https://stackoverflow.com/questions/12845206/check-if-file-exists-on-remote-host-with-ssh

ssh로 원격 호스트의 파일이 존재하는 지 확인

저는 원격 호스트에서 특정 파일이 있는지 확인하고 싶습니다. 그래서 다음을 시도했습니다.

$ if [ ssh reg@localhost -p 19999 -e /home/reg/Dropbox/New_semiosNET/Research_and_Development/Puffer_and_Traps/Repeaters_Network/UBC_LOGS/log1349544129.tar.bz2 ] then echo "okidoke"; else "not okay!" fi
-sh: syntax error: unexpected "else" (expecting "then") 

13개의 답변 중 1 개의 답변

여러 답변에 근거하여 다음처럼 짧게 사용하는 방법이 있습니다.

ssh -q $HOST [[ -f $FILE_PATH ]] && echo "File exists" || echo "File does not exist";

-q는 quiet 모드입니다. 이는 warning과 메세지를 덜 나오게 할 것입니다.

@Mat님이 언급했듯이 이처럼 테스트하는 것의 이득은 -f-nt, -d, -s... 등과 같은 다른 테스트 연산자로 쉽게 바꿀 수 있기 때문에 좋습니다.

테스트 연산자: http://tldp.org/LDP/abs/html/fto.html

반응형
반응형

출처 : http://serverfault.com/questions/62411/how-can-i-sort-du-h-output-by-size

크기로 du -h의 출력을 정렬할 수 있나요?

저는 du 출력을 사람이 읽을 수 있는 목록으로 얻고 싶습니다.

하지만, du는 "크기로 정렬"이란 옵션이 없기 때문에 sort로 pipe하는 것은 사람이 읽을 수 있도록 하는 플래그(human readable flag)가 작동하지 않습니다.

예를 들어 다음 명령을 실행하면

du | sort -n -r 

(내림차순으로) 크기로 정렬된 디스크 사용량이 출력됩니다.

du |sort -n -r
65108   .
61508   ./dir3
2056    ./dir4
1032    ./dir1
508     ./dir2

하지만, 사람이 읽을 수 있도록 하는 플래그(human readable flag)를 사용하여 실행하면 적절하게 정렬되지 않습니다.

du -h | sort -n -r
508K    ./dir2
64M     .
61M     ./dir3
2.1M    ./dir4
1.1M    ./dir1

크기로 du -h를 정렬하는 방법을 아시는 분이 계신가요?


39 개의 답변 중 1개의 답변

2009년 8월에 GNU coreutils 7.5 가 나오고 부터, du -h와 같은 종류의 접미사를 사용하는 -h 파라미터를 sort에서 쓸 수 있습니다.

du -hs * | sort -h

만약 -h를 지원하지 않는 sort를 사용하신다면, GNU Coreutils를 설치할 수 있습니다. 다음은 오래된 Mac OS X 입니다.

brew install coreutils
du -hs * | gsort -h

다음은 sort 매뉴얼 내용입니다.

-h, --human-numeric-sort 사람이 읽을 수 있는 숫자를 비교한다 (예시, 2K 1G)

반응형

+ Recent posts