개요

 

 

안녕하세요 피터입니다.

오늘은 리눅스(linux)에서 하이픈(-)으로 시작하는 파일을 처리하는 방법에 대해서 알려드리겠습니다.

간혹 명렁어나 스크립트를 잘못 사용하면 하이픈으로 시작하는 파일이 생성되는 경우가 있습니다. 

리눅스에서 하이픈은 명령어에서 옵션을 지정 할 때 사용되기 때문에 파일명이 하이픈으로 시작하면 shell 에서 다루기가 쉽지 않습니다.  

일반적인 쉘의 쿼우팅(Quotiong) 방법으로 처리하려 하면 아래와 같이 잘못된 옵션이라는 에러 메시지를 보게 될 확율이 높습니다.

 

[root@peterdev dummy]# ll
total 0
-rw-r--r--. 1 root root 0 Oct 30 06:48 -d
-rw-r--r--. 1 root root 0 Oct 30 06:50 p-s
-rw-r--r--. 1 root root 0 Oct 30 06:49 -s_test.txt
[root@peterdev dummy]# clear
[root@peterdev dummy]# rm -f '-d'
[root@peterdev dummy]# rm -f "-d"
[root@peterdev dummy]# mv "-d" dst
mv: invalid option -- 'd'
Try 'mv --help' for more information.
[root@peterdev dummy]# ll
total 0
-rw-r--r--. 1 root root 0 Oct 30 06:48 -d
-rw-r--r--. 1 root root 0 Oct 30 06:50 p-s
-rw-r--r--. 1 root root 0 Oct 30 06:49 -s_test.txt

rm 또는 mv 명령어에 파일명을 ' 또는 " 로 쿼우팅을 해도 하이픈으로 시작하는 파일은 제대로 처리가 되지 않습니다. 

 

해결방법

이런 경우에는 하이픈 두개(--)를 추가해서 해결할 수 있습니다. 

[root@peterdev dummy]# ll
total 0
-rw-r--r--. 1 root root 0 Oct 30 06:48 -d
-rw-r--r--. 1 root root 0 Oct 30 06:50 p-s
-rw-r--r--. 1 root root 0 Oct 30 06:49 -s_test.txt
[root@peterdev dummy]# rm -f -- -d
[root@peterdev dummy]# ll
total 0
-rw-r--r--. 1 root root 0 Oct 30 06:50 p-s
-rw-r--r--. 1 root root 0 Oct 30 06:49 -s_test.txt
[root@peterdev dummy]#

 

rm -f 명령어 다음에 -- 를 추가하면 바로 뒤에 하이픈으로 시작하는 파일명을 정상적으로 인식합니다. 

-- 는 - 를 특수한 의미를 갖는 기호가 아닌 일반 문자로 취급하라는 의미이기 때문입니다. 

 

마찬가지로 mv 명령어에도 -- 를 사용하면 정상적으로 처리 됩니다. 

[root@peterdev dummy]# ll
total 0
-rw-r--r--. 1 root root 0 Oct 30 06:50 p-s
-rw-r--r--. 1 root root 0 Oct 30 06:49 -s_test.txt
[root@peterdev dummy]# mv -- -s_test.txt test.txt
[root@peterdev dummy]# ll
total 0
-rw-r--r--. 1 root root 0 Oct 30 06:50 p-s
-rw-r--r--. 1 root root 0 Oct 30 06:49 test.txt
[root@peterdev dummy]#

 

 

-Peter의 우아한 프로그래밍

여러분의 공감과 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.

 

 

블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요

안녕하세요 피터입니다.

오늘은 리눅스의 I/O 재지향(redirection)에 대해서 설명드리겠습니다.

재지향파이프(pipe)와 더불어 리눅스의 명령어들을 훨씬 강력하게 무장시켜주는 역할을 하는 핵심 기능입니다.

마치 그 자체로는 특별한 맛이 나지 않지만 단맛이나 짠맛 같은 다른 맛을 훨씬 강하게 만들어주는 조미료와 같다고 할까요?


파이프는 아래 글에서 자세히 보실 수 있습니다.

개요

리눅스 쉘은 항상 아래와 같이 표준 입출력파일 형태로 열고 있습니다.
  • 표준입력(stdin: 키보드)
  • 표준출력(stdout: 모니터)
  • 표준에러(stderr: 모니터)


기본적으로 프로그램은 연산 결과를 출력 장치(파일, 모니터, 프린터 등)로 내보내는데요. 이 출력되는 데이터를 임의로 다른 장치로 보내는 것을 재지향(redirection)이라고 합니다.


다시 말하면 파일이나 프로그램, 명령어 등의 출력을 낚아채어 다른 파일이나 프로그램, 명령어의 표준 입력으로 보내는 것을 말합니다.


사용법

표준 입출력은 파일 형태로 열려 있다고 말씀드렸는데요. 리눅스에서 열려 있는 파일은 파일 디스크립터(file descriptor)를 할당 받게 됩니다.

  • 표준 입력(stdin) = 0
  • 표준 출력(stdout) = 1
  • 표준 에러(stderr) = 2

이렇게 0, 1, 2파일 디스크립터를 할당받기 때문에 이를 이용해서 재지향을 할 수 있습니다.



> file
표준 출력을 파일로 재지향 합니다. 파일이 없으면 새로 만들고, 파일이 있으면 덮어씁니다.

>> file
표준 출력을 파일로 재지향 합니다. 파일이 없으면 새로 만들고, 파일이 있으면 파일의 끝에 덧붙입니다.

2>&1
표준 에러를 표준 출력으로 재지향합니다. 표준 에러도 표준 출력의 자격으로 보내집니다.

< file
파일로부터 표준 입력을 받도록 재지향합니다.


예제

ex) test.txt 파일의 출력을 test.out 파일로 저장

cat test.txt > test.out

ex) today.log 파일의 출력을 week.log 파일의 끝에 덧붙임

cat today.log >> week.log


ex) cat 명령어의 에러를 표준 출력으로 재지향하고 표준 출력을 out 파일로 재지향

[root@peterdev test]# cat nofile > out 2>&1
[root@peterdev test]# cat out
cat: nofile: No such file or directory

에러가 표준 출력으로 재지향 되었기 때문에 화면에 에러가 출력되는 대신에 out 파일에 기록됩니다.


ex) ls 명령어의 에러를 /dev/null 로 재지향

[root@peterdev test]# ls -xy 2> /dev/null
[root@peterdev test]#

/dev/null 은 특수 파일로 이 파일로 출력된 데이터는 버려집니다.

ls 명령에 xy 라는 잘못된 옵션을 입력하여 에러가 발생하였지만, /dev/null 로 재지향하여 출력을 없애버렸습니다.



 

-Peter의 우아한 프로그래밍

여러분의 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.

블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요


개요


chmod 명령어는 리눅스의 파일이나 디렉토리의 권한을 변경하는 명령어입니다.



사용법

리눅스에서 사용되는 명령어는 모두 대소문자를 구분하니 주의해주세요.

chmod 명령어의 사용법은 다음과 같습니다.


Usage: chmod [OPTION]... MODE[,MODE]... FILE...
  or:  chmod [OPTION]... OCTAL-MODE FILE...
  or:  chmod [OPTION]... --reference=RFILE FILE...
Change the mode of each FILE to MODE.
With --reference, change the mode of each FILE to that of RFILE.

  -c, --changes          like verbose but report only when a change is made
  -f, --silent, --quiet  suppress most error messages
  -v, --verbose          output a diagnostic for every file processed
      --no-preserve-root  do not treat '/' specially (the default)
      --preserve-root    fail to operate recursively on '/'
      --reference=RFILE  use RFILE's mode instead of MODE values
  -R, --recursive        change files and directories recursively
      --help     display this help and exit
      --version  output version information and exit

Each MODE is of the form '[ugoa]*([-+=]([rwxXst]*|[ugo]))+|[-+=][0-7]+'.

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>


기본 사용법은 아래와 같이 변경하고자 하는 권한과 파일명을 명시하여 실행하면 됩니다.

chmod 755 test.txt


리눅스 파일 권한

리눅스 파일은 user, group, others 별로 read, write, execute 권한을 부여할 수 있습니다.


ls 명령으로 현재 파일에 부여되어 있는 권한을 확인할 수 있습니다.

[Linux] ls (파일 목록 보기)


[root@peterdev ch]# ls -l
total 0
-rw-r--r-- 1 root root 0 Jun  4 08:45 test.txt


-rw-r--r-- 에서 맨앞의 - 는 file 인지 directory인지 구분하는 symbol 입니다.

[root@peterdev test]# ls -l
total 44
-rwxr-xr-x 1 root root 8576 May 10 08:38 a.out
-rw-r--r-- 1 root root  214 May 10 08:38 arr1.c
-rw-r--r-- 1 root root  425 May 10 07:30 arr.c
drwxr-xr-x 2 root root 4096 Jun  4 08:45 ch
drwxr-xr-x 2 root root 4096 May  3 14:27 john
-rw-r--r-- 1 root root    0 May  8 14:40 mv_test.dat
-rw-r--r-- 1 root root    0 May  9 06:06 new_file
-rw-r--r-- 1 root root    5 May  9 06:09 new.txt
drwxr-xr-x 2 root root 4096 May  3 14:27 peter
-rw-r--r-- 1 root root   33 May 14 09:00 test1.txt
-rw-r--r-- 1 root root   33 May  8 14:56 test2.txt

이렇게 directory인 경우에는 d 라는 symbol로 표시됩니다.


rw-r--r-- 로 표시되는 부분이 부여된 권한을 나타내는데 3개씩 끊어서 보면

앞에 3개가 user 소유자(owner)의 권한이고,

중간에 3개는 group 대한 권한,

마지막 3개가 others 에 대한 권한이 됩니다.


이 권한을 8진수로 표현하면 rwx 권한을 다 갖는 경우 7이 됩니다.

각 권한을 숫자값으로 표현하면 r = 4, w = 2, x = 1 이기 때문에

r + w + x = 7

이렇게 되는 것이죠.


파일에 user와 group 에 대해서만 read 권한을 부여하려면 440 으로 적용하면 됩니다.


+, - 기호를 사용해서 특정 권한을 더하거나 뺄 수도 있습니다.


예제

ex) text.txt 파일에 대해서 user의 모든권한을 부여하고 group과 others는 모든 권한을 제외
chmod 700 test.txt

 

ex) text.txt 파일에 대해서 실행 권한 추가 부여
chmod +x test.txt

ex) text.txt 파일에 대해서 group에 write 권한 부여
chmod g+w test.txt
 

ex) text.txt 파일에 대해서 others의 모든 권한 박탈
chmod o-rwx test.txt
 

-Peter의 우아한 프로그래밍

여러분의 공감과 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.




블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요

 

개요

 

안녕하세요 피터입니다.

오늘은 여러분들이 왜 Bash 쉘 프로그래밍을 배워야 하는지에 대해서 설명드리겠습니다. 

리눅스(Linux) 환경에서 개발을 하거나, 시스템 관리자 업무를 수행하는데 있어서 Bash 쉘을 잘 다룰 수 있다는 점은 굉장한 경쟁력이 됩니다.

그만큼 업무를 효율적으로 수행할 수 있으니까요.

 

Bash"Bourne-Again Shell"의 앞 글자를 딴 것입니다.  Stephen Bourne의 Bourne Shell에 대한 클리쉐로 일종의 말장난 같은 겁니다. Bash는 이제 모든 종류의 유닉스에서 쉘 스크립트에 관한 실질적인 표준입니다.

쉘은 명령어 해석기(command interpreter)로서, 단지 커널과 사용자 중간에 놓여 있는것 이상으로 꽤 강력한 프로그래밍 언어입니다.

일반적으로 스크립트(Script)라고 부르는 쉘 프로그램은 .sh 확장자로 만드는 경우가 많으며 시스템 콜(System call)이나 다른 유틸리티(Utility) 또는 실행 파일 등을 서로 연결하여 특정 목적에 맞는 프로그램을 쉽게 만들 수 있게 해줍니다.

쉘 내부 명령어와 테스트, 루프 등을 활용하여 다소 복잡한 로직의 프로그램도 빠르게 개발이 가능하기 때문에 정식 패치 이전에 즉각적으로 반영이 필요한 긴급 이슈에 대응할 때에도 유용하게 사용될 수 있습니다.

이밖에도 쉘 스크립트는 완전히 구조적인 프로그래밍 언어의 편리한 부가 기능들이 필요없는 작업들, 특별히 시스템 관리자의 시스템 관련 작업이나 반복적인 일들을 처리할 때 굉장히 효율적입니다.

 

쉘 문법은 간단하고 명확하기 때문에 배우는 것은 크게 어렵지 않습니다. 테스트와 디버깅도 쉽습니다.

이런 강점은 실제 프로젝트를 진행하기 앞서서 프로토타이핑(Prototyping) 하기에 좋습니다.

개발에 들어가기 전 설계 단계에서 구조적인 결함을 조기에 발견할 수 있다면 그만큼 전체 프로젝트의 완성도가 높아질 뿐 아니라 리소스 낭비를 대폭 줄일 수 있습니다.

이러한 장점에도 불구하고 쉘 스크립트는 명확한 한계를 갖고 있기 때문에 아래와 같은 프로젝트는 다른 언어로 개발하는 것이 바람직합니다.

 

쉘 스크립트를 쓰면 안 될 때

  • 리소스에 민감한 작업들, 특히 속도가 중요한 요소일 때(정렬, 해쉬 등등)

  • 강력한 산술 연산 작업들, 특히 임의의 정밀도 연산(arbitrary precision)이나 복소수를 써야 할 때(C++을 쓰세요)

  • 플랫폼간 이식성이 필요할 때(C를 쓰세요)

  • 구조적 프로그래밍이 필요한 복잡한 어플리케이션(변수의 타입체크나 함수 프로토타입등이 필요할 때)

  • 업무에 아주 중요하거나 회사의 미래가 걸렸다는 확신이 드는 어플리케이션

  • 보안상 중요해서, 여러분 시스템의 무결성을 보장하기 위해 외부의 침입이나 크래킹, 파괴등을 막아야 할 필요가 있을 때

  • 서로 의존적인 관계에 있는 여러 콤포넌트로 이루어진 프로젝트

  • 과도한 파일 연산이 필요할 때(Bash는 제한적인 직렬적 파일 접근을 하고 , 특히나 불편하고 불충분한 줄단위 접근만 가능)

  • 다차원 배열이 필요할 때

  • 링크드 리스트나 트리같은 데이타 구조가 필요할 때

  • 그래픽이나 GUI를 만들고 변경하는 등의 일이 필요할 때

  • 시스템 하드웨어에 직접 접근해야 할 때

  • 포트나 소켓 I/O가 필요할 때

  • 예전에 쓰던 코드를 사용하는 라이브러리나 인터페이스를 써야 할 필요가 있을 때

  • 독점적이고 소스 공개를 안 하는 어플리케이션을 짜야 할 때(쉘 스크립트는 필연적으로 오픈 소스입니다.)

 

 

 
 

-Peter의 우아한 프로그래밍

여러분의 공감과 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.

 

참고

http://wiki.kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/index.html

 

블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요

개요

ntpdate 명령어는 리눅스의 시간을 timeserver와 동기화하는 명령어입니다.

리눅스는 서버로 운영되는 경우가 많은데 서버 시간은 서버에서 동작하는 여러 서비스에 영향을 주게 되기 때문에 항상 정확한 시간 정보를 유지하는 것이 좋습니다.

정확한 시간 정보 유지를 위해 타임서버(Time Server)의 시간 정보를 불러와서 기준 시간으로 삼을 수 있습니다.


기본적으로 rdate 명령어와 같은 기능을 수행합니다.

[Linux] rdate로 시간동기화 하기



사용법

리눅스에서 사용되는 명령어는 모두 대소문자를 구분하니 주의해주세요.

ntpdate 명령어의 문법은 다음과 같습니다.


usage: ntpdate [-46bBdqsuv] [-a key#] [-e delay] [-k file] [-p samples] [-o version#] [-t timeo] [-U username] server ...

 

기본 사용법은 rdate와 큰 차이가 없습니다.

ntpdate timeserver

timeserver 에 시간 서버 주소를 넣어주면 해당 서버와 시간 동기화를 수행합니다.


시간 서버 목록

현재 사용 가능한 시간 서버 목록입니다. 아래 중에 하나의 서버를 선택하여 동기화 해주시면 됩니다.

  • time.bora.net
  • time.nuri.net
  • time.windows.com
  • ntp.kornet.net
  • time.nist.gov

예제

ex) time.bora.net 에 시간 동기화
ntpdate time.bora.net

 

 

-Peter의 우아한 프로그래밍

여러분의 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.

블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요

개요

rdate 명령어는 리눅스의 시간을 timeserver와 동기화하는 명령어입니다.

리눅스는 서버로 운영되는 경우가 많은데 서버 시간은 서버에서 동작하는 여러 서비스에 영향을 주게 되기 때문에 항상 정확한 시간 정보를 유지하는 것이 좋습니다.

정확한 시간 정보 유지를 위해 타임서버(Time Server)의 시간 정보를 불러와서 기준 시간으로 삼을 수 있습니다.


기본적으로 ntpdate 명령어와 같은 기능을 수행합니다.

[Linux] ntpdate로 시간동기화 하기


사용법

리눅스에서 사용되는 명령어는 모두 대소문자를 구분하니 주의해주세요.

rdate 명령어에 필요한 argument들의 대한 usage 정보는 rdate 라고만 입력하고 실행하면 볼 수 있습니다.


Usage: rdate [-s] [-p] [-u] [-l] [-t sec] <host> ...

 

기본 사용법은 아래와 같습니다.

rdate -s timeserver

timeserver 에 시간 서버 주소를 넣어주면 해당 서버와 시간 동기화를 수행합니다.


시간 서버 목록

현재 사용 가능한 시간 서버 목록입니다. 아래 중에 하나의 서버를 선택하여 동기화 해주시면 됩니다.

  • time.bora.net
  • time.nuri.net
  • time.windows.com
  • ntp.kornet.net
  • time.nist.gov

예제

ex) time.bora.net 에 시간 동기화
rdate -s time.bora.net


rdate 설치

만일 rdate가 설치되어 있지 않다면 아래와 같이 yum 을 이용해 설치해줍니다.

[root@peterdev ~]# yum -y  install rdate
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: mirror.dmmlabs.jp
 * extras: ftp.iij.ad.jp
 * ius: mirrors.kernel.org
 * updates: ftp.iij.ad.jp
Resolving Dependencies
--> Running transaction check
---> Package rdate.x86_64 0:1.4-25.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==================================================================================================
 Package              Arch                  Version                     Repository           Size
==================================================================================================
Installing:
 rdate                x86_64                1.4-25.el7                  base                 19 k

Transaction Summary
==================================================================================================
Install  1 Package

Total download size: 19 k
Installed size: 29 k
Downloading packages:
rdate-1.4-25.el7.x86_64.rpm                                                |  19 kB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : rdate-1.4-25.el7.x86_64                                                        1/1
  Verifying  : rdate-1.4-25.el7.x86_64                                                        1/1

Installed:
  rdate.x86_64 0:1.4-25.el7

Complete!
[root@peterdev ~]#


정기적인 시간 동기화

정확한 시간을 유지하기 위해 rdate 명령을 정기적으로 실행하고자 한다면, crontab에 등록하면 됩니다.

하지만 이런 방법 보다는 ntp 데몬을 사용하시는 것을 권장합니다.


 

 

-Peter의 우아한 프로그래밍

여러분의 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.

블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요