기본 콘텐츠로 건너뛰기

8. cp

안녕하세요, MJ 입니다. 리눅스 파일복사 명령어 cp 에 대해 알아보겠습니다. 리눅스 cp 명령어는 윈도우 copy 명령어와 같은 기능을 합니다. 파일이나, 디렉토리를 복사 할 때 사용됩니다. cp 명령어의 도움말을 확인 해 보겠습니다. 펼치기/접기 Usage: cp [OPTION]... [-T] SOURCE DEST   or:  cp [OPTION]... SOURCE... DIRECTORY   or:  cp [OPTION]... -t DIRECTORY SOURCE... Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY. Mandatory arguments to long options are mandatory for short options too.   -a, --archive                same as -dR --preserve=all       --attributes-only        don't copy the file data, just the attributes       --backup[=CONTROL]...

MJ.제라의 요일 공식 스크립트(bash, batch, powershell)

안녕하세요, MJ 입니다.

년-월-일 의 정보로 요일을 확인할 수 있는 방법 입니다.

1582년10월 15일부터는 그레고리 력으로 우리가 사용하는 서기에 적용되는 윤년/평년 확인방법입니다.

다음 3가지를 확인하여 윤년과, 평년을 미리 알 수 있습니다.
  1. 년수 4로 나누었을 때 나머지가 없는 해를 윤년으로 함.
  2. 위의 윤년중에서 100으로 나누었을 때 나머지가 없을때는 평년으로 함.
  3. 다시 400으로 나누었을 때 나머지가 없는 해는 윤년으로 함

3가지 조건 이지만 의외로 복잡합니다.

 

아뭏든 날짜를 넣으면 요일이 출력이 된다는 것입니다.

아래 스크립트는 단순히 입력 받은 날짜가 무슨 요일인지 영어로 토해내도록 작성되었습니다.


다른 스크립트 또는 프로그램에서 특정일자의 요일을 확인해야 하는 로직이 존재하는 경우,

OS 스크립트를 수행하여 결과를 받도록 하면, 추가로 작성해야 하는 코드의 양을 줄일 수 있어 활용하기에 따라 경제적으로 이득을 취할 수 있습니다.

 * 활용 예시 *

로또 API 를 이용해서 모든 회차의 당첨번호를 가져올 수 있지만, API 요청으로 얻어지는 정보는 무제한으로 제공되지 않고 대부분 하루동안 N회 가져올 수 있습니다. 그래서 최초에 한번 가져온 데이터를 별도 파일이나 DB에 저장을 하고, 당첨번호 목록을 조회 할 때에 내가 저장해둔 파일 또는 DB에서 검색해서 확인하게 됩니다. (무제한 접근가능하다고 하여도 속도가 훨씬 빠릅니다.) 하지만 조회를 시도하는 시점에서 오늘이 토요일이라면, 그리고 당첨번호 발표 시간이 지났고 동행복권 사이트에 당첨번호 정보가 등록이 되었다면 이 새로운 회차의 당첨번호는 API요청을 해서 가져와야 나의 저장된 데이터가 업데이트 될 수 있을 것 입니다. 저는 이 요일을 확인하도록 해서 이 스크립트를 수행하여 오늘이 토요일이 아닌지 매번 확인을 하도록 하고, 발표시간이 지났다면 API 한번 찔러보는 방법으로 하루동안 아무리 많이 찔러도 10번도 안찌르는것 같습니다.저는 파이썬에서 OS의 명령어를 수행하고 결과를 받아오도록 작성하였고, 이 외에도 요일의 체크가 필요한 경우에 여러 프로그램이나 스크립트에서 수행하도록 할 수 있기때문에 은근히 활용도가 높다고 볼 수 있겠습니다.


 배치와 파워쉘 환경은 제가 익숙하지 않아, 예외처리 내용이 좀 부족합니다.
실행 방법을 잘 확인 해 주세요.

스크립트는 다음 3가지 버전으로 작성되었습니다.

  • Bash 스크립트(Linux)
  • 배치 스크립트 (windows)
  • 파워쉘 스크립트(windows)

    사용하시는 OS에서 지원하는 스크립트를 작성하여 사용할 수 있습니다.

bash 스크립트

#!/bin/bash
 
if [ ${#} -ne 1 ] && [ ${#} -ne 0 ];then
    echo "Usage: ${0} yyyy-mm-dd"
    exit 1
fi

if [ ${#} -eq 1 ];then
    INPUT=${1}
elif [ ${#} -eq 0 ];then
    echo -n "please input date (format: yyyy-mm-dd): "
    read INPUT
fi

wrong_bit=0
tmp_y=$(expr substr $INPUT 1 4)
tmp_m=$(expr substr $INPUT 6 2)
tmp_d=$(expr substr $INPUT 9 2)
seq $tmp_y $tmp_y &> /dev/null
if [ $? -ne 0 ];then
    wrong_bit=$(expr ${wrong_bit} + 4)
fi
seq $tmp_m $tmp_m &> /dev/null
if [ $? -ne 0 ];then
    wrong_bit=$(expr ${wrong_bit} + 2)
fi
seq $tmp_d $tmp_d &> /dev/null
if [ $? -ne 0 ];then
    wrong_bit=$(expr ${wrong_bit} + 1)
fi
if [ ${wrong_bit} -ne 0 ];then
    if   [ ${wrong_bit} -eq 7 ];then
        echo 'Wrong Your Input Number of Year, Month, Day.'
    elif [ ${wrong_bit} -eq 6 ];then
        echo 'Wrong Your Input Number of Year, Month.'
    elif [ ${wrong_bit} -eq 5 ];then
        echo 'Wrong Your Input Number of Year, Day.'
    elif [ ${wrong_bit} -eq 4 ];then
        echo 'Wrong Your Input Number of Year.'
    elif [ ${wrong_bit} -eq 3 ];then
        echo 'Wrong Your Input Number of Month, Day.'
    elif [ ${wrong_bit} -eq 2 ];then
        echo 'Wrong Your Input Number of Month.'
    elif [ ${wrong_bit} -eq 1 ];then
        echo 'Wrong Your Input Number of Day.'
    fi
    exit 1
fi

 
getDay()
{
yy=$(expr substr $1 1 4)
mm=$(expr substr $1 6 2)
dd=$(expr substr $1 9 2)
if [ $mm = "01" ] || [ $mm = "02" ]; then
yy=$(expr $yy - 1)
mm=$(expr $mm + 12)
fi
yC=$(expr $yy / 100)
yY=$(expr $yy % 100)
 
# 제라의 요일 공식
num=$(echo $1 | awk '{ printf("%d", ((21*'$yC'/4)+(5*'$yY'/4)+(26*('$mm'+1)/10)+'$dd'-1) % 7); }')
 
case $num in
0) echo 'Sun' ;;
1) echo 'Mon' ;;
2) echo 'Tue' ;;
3) echo 'Wed' ;;
4) echo 'Thu' ;;
5) echo 'Fri' ;;
6) echo 'Sat' ;;
esac
}
getDay ${INPUT}

배치 스크립트

@echo off
:: 인수로 연도(4자리)-월(2자리)-일(2자리) 를 입력합니다.
:: 인수가 없으면 입력을 받습니다.
 
set /a _argc=0
 
for %%i in (%*) do (set /A _argc+=1)
rem echo %_argc%
 
if %_argc% EQU 0 (
    set /p var="please input date (format: yyyy-mm-dd):"
)else if %_argc% EQU 1 (
    set var=%1%
) else (
    echo "Usage: %0 yyyy-mm-dd"
    goto end
)
set /a "yyyy=%var:~0,4% %% 99999999" 2> nul
 
if        %var:~5,2% EQU 01 (set /a mm=1
)else if  %var:~5,2% EQU 02 (set /a mm=2
)else if  %var:~5,2% EQU 03 (set /a mm=3
)else if  %var:~5,2% EQU 04 (set /a mm=4
)else if  %var:~5,2% EQU 05 (set /a mm=5
)else if  %var:~5,2% EQU 06 (set /a mm=6
)else if  %var:~5,2% EQU 07 (set /a mm=7
)else if  %var:~5,2% EQU 08 (set /a mm=8
)else if  %var:~5,2% EQU 09 (set /a mm=9
)else (set /a mm=%var:~5,2%)
 
if       %var:~8,2% EQU 01 (set /a dd=1
)else if %var:~8,2% EQU 02 (set /a dd=2
)else if %var:~8,2% EQU 03 (set /a dd=3
)else if %var:~8,2% EQU 04 (set /a dd=4
)else if %var:~8,2% EQU 05 (set /a dd=5
)else if %var:~8,2% EQU 06 (set /a dd=6
)else if %var:~8,2% EQU 07 (set /a dd=7
)else if %var:~8,2% EQU 08 (set /a dd=8
)else if %var:~8,2% EQU 09 (set /a dd=9
)else (set /a dd=%var:~8,2%)
 
if %mm% EQU 1 (set /a mm=%mm%+12 2>nul
    set /a yyyy=%yyyy%-1 2>nul
)
if %mm% EQU 2 (set /a mm=%mm%+12 2>nul
    set /a yyyy=%yyyy%-1 2>nul
)
 
set /a a=%yyyy:~0,2%
if       %yyyy:~2,2% EQU 01 (set /a b=1
)else if %yyyy:~2,2% EQU 02 (set /a b=2
)else if %yyyy:~2,2% EQU 03 (set /a b=3
)else if %yyyy:~2,2% EQU 04 (set /a b=4
)else if %yyyy:~2,2% EQU 05 (set /a b=5
)else if %yyyy:~2,2% EQU 06 (set /a b=6
)else if %yyyy:~2,2% EQU 07 (set /a b=7
)else if %yyyy:~2,2% EQU 08 (set /a b=8
)else if %yyyy:~2,2% EQU 09 (set /a b=9
)else (set /a b=%yyyy:~2,2%)
set /a c=%mm%
set /a d=%dd%
 
::echo %a%
::echo %b%
::echo %c%
::echo %d%
 
set /a dname=((21*%a%/4)+(5*%b%/4)+(26*(%c%+1)/10)+%d%-1)%%7
if %dname% EQU 0 (echo 'Sun')
if %dname% EQU 1 (echo 'Mon')
if %dname% EQU 2 (echo 'Tue')
if %dname% EQU 3 (echo 'Wed')
if %dname% EQU 4 (echo 'Thu')
if %dname% EQU 5 (echo 'Fri')
if %dname% EQU 6 (echo 'Sat')
 
:: pause
 
:end

파워쉘 스크립트

if ( $args.Count -ne 1 ) {
    echo -n "Usage: .\$($MyInvocation.MyCommand.Name) yyyy-mm-dd"
    exit 1
}
 
$input_date=$args[0]
 
$yyyy=$input_date.split('-')[0]
$mm=$input_date.split('-')[1]
$dd=$input_date.split('-')[2]
 
$mod=$false
if( [int]$mm -eq 1 ) {
    $mod = $true
} elseif( [int]$mm -eq 2 ) {
    $mod = $true
}
 
if ( $mod -eq $true ) {
    $mm = [int]$mm + 12
    $yyyy = [int]$yyyy - 1
}
 
 
$a = [int]($yyyy / 100)
$b = [int]($yyyy % 100)
$c = [int]$mm
$d = [int]$dd
 
$dname=[int]((21*$a/4)+(5*$b/4)+(26*($c+1)/10)+$d-1)%7
 
switch($dname) {
    0 { $toDay = 'Sun' }
    1 { $toDay = 'Mon' }
    2 { $toDay = 'Tue' }
    3 { $toDay = 'Wed' }
    4 { $toDay = 'Thu' }
    5 { $toDay = 'Fri' }
    6 { $toDay = 'Sat' }
}
 
echo $toDay
 
 
 

댓글

가장 많이 본 글

2. 버추얼박스(2/2): VM생성

안녕하세요, MJ입니다.   VM 생성 후 , OS 설치를 해야 VM 을 사용 해 볼 수 있을텐데 ,   현재 서버용 OS 로 가장 많이 사용되는 Red Hat 리눅스로 하고싶지만 , 라이선스 문제로 커뮤니티 버전의 OS 중에 Red Hat 계열의 Rocky Linux 로 제가 마음대로 결정 해 보았습니다 . ( 버전은 현재 기준으로 최신 9.4 버전 )   현재는 OS 를 설치 하기위한 미디어가 없는줄로 압니다 . 설치 미디어를 다운로드 하는데에 시간이 걸리기때문에 , 설치미디어 다운로드를 먼저 걸어놓고 , VM 생성을 하겠습니다 .   1. Rocky Linux – 9.4 iso 이미지 다운로드 URL: https://rockylinux.org/download   ( " DVD ISO " 버튼을 클릭하면 다운로드가 시작됩니다 . )   2 . VM 생성 2-1) 기본정보입력 버추얼 박스 프로그램 실행 . 새로만들기 버튼 클릭 생성 할 VM 의 이름을 작성 iso 이미지를 다운로드 중이므로 아직 선택하지 않고 넘어갑니다 . OS 종류로 "Linux" 를 선택 OS 배포판으로 "RedHat 9.x (64bit)" 을 선택 ( Rocky Linux 가 래드햇계열인데 , 목록에 Rocky Linux 가 없어서 ) 다음 버튼 클릭   iso 이미지를 넣고 시작하게 되면 , 무인 설치 건너뛰기 옆 체크박스에 체그가 안 된 상태가 확인되는데 , 무인설치를 하지 않도록 체크를 해 주세요 . ( 설치 과정을 봐야하기때문에 무인설치가 안되면 좋겠습니다 .)   2-2) 스펙 : 메모리 용량 , CPU 개수 , BootMode("Legacy"/E...

1. 버추얼박스(1/2): 설치

안녕하세요, MJ입니다. 나의 환경에서 리눅스 머신을 별도로 구동시키고 , 테스트 해 보기위해 가상환경이 필요하게 됩니다 . 가상환경이라고 해서 거창한것처럼 보일 수 있지만 , 가상환경은 가상의 머신을 구동 시킬 수 있는 환경으로 버추얼 박스 , VMWare, Hyper-V, QEMU 정도가 알려진 가상환경 에뮬레이터 라고 볼 수 있겠습니다 .   이 중에서 완전 무료로 사용할 수 있는 것은 Hyper-V 와 QEMU 이지만 , VirtualBox 역시 ExtensionPack 을 설치하지 않는다면 상업용으로도 무료로 사용할 수 있습니다. (비 상업적인 용도로는 ExtensionPack을 설치해도 무료입니다) 조작 및 사용방법이 간단한 VirtualBox 를 이용해 가상 환경 구성을 위한 방법에 대해 소개 하겠습니다 .     1) 버추얼박스 다운로드 - 사이트 : https://virtualbox.org 사이트 접속 후 왼쪽 Downloads 클릭 Windows hosts 클릭 다운로드 된 프로그램을 실행 .   2) 버추얼박스 설치 실패 , 추가 프로그램 확인   버추얼박스 설치 시도 시 "microsoft visual c++ 2019 redistributable package being installed first" 이런 메시지가 확인되었고 , 버추얼박스 설치는 되지 않았습니다 . 구글에서 "microsoft visual c++ 2019 redistributable package being installed first" 이 메시지를 검색해서 첫번째로 확인되는 마이크로소프트 사이트 방문 . 버추얼박스 설치 실패 시 확인된 Redistributable 프로그램을 찾아가 내 OS 의 아키텍처와 일치...

6. OS 설치 후 확인(Rocky Linux - 9.4 )

안녕하세요 MJ 입니다 .   지난번 설치 했던 OS (Rocky Linux - 9.4) 의 부팅 된 화면 입니다 .   번 시간에는 OS 설치 시 설정 했던 내용들에 대해서 하나씩 잘 설정이 적용 되었는지 확인을 해 보도록 하겠습니다 .   [ 설치 시 설정 한 메뉴 ] root 계정 설정 일반유저 생성 타임존 패키지 꾸러미 선택 파티셔닝 네트워크     설정확인 (1/6): root 계정 설정 지정한 패스워드로 로그인을 시도 해 봅니다 . 로그인이 잘 됩니다 . ( 패스워드 설정 확인 )   설정확인 (2/6): 일반유저 생성 로그인 확인 일반유저도 로그인이 잘 됩니다 . ( 패스워드 설정 확인 )   관리자 권한 추가그룹으로 wheel 이 확인됩니다 . ( 관리자 권한 확인 ) : gid 에 표시된 그룹과 , groups 에 표시 된 그룹은 다른 것 입니다 . 계정은 소유자 아이디와 그룹 아이디를 필수로 가져야하고 , 다른 그룹을 가지는 것은 추가그룹 이라고 합니다 . uid 는 여러 개 가질 수 없지만 , 그룹은 여러 개를 가질 수 있습니다 .   Red Hat 계열의 리눅스 기준으로 , ~6 버전까지는 500 번이 일반 유저가 가지는   UID/GID 의 시작이고 , 7~ 버전부터는 1000 번이 시작되며,   기본 관리자 그룹으로 wheel 이 생성 및 설정 됩니다.     설정확인 (3/6): 타임존   설정 한 대로 , 한국시 (Asia/Seoul) 확인이 확인됩니다 .   설정확인 (4/6): 패키지 꾸러미 선택 선택 했던 ...