codeheart 위치로그  |  태그  |  미디어로그  |  방명록
icon 개발/Script 에 해당하는 글4 개
2013.12.23   powershell 응용
2013.09.14   [powershell] 파워쉘 속성 튜토리얼 1
2013.09.09   [ruby] 변수/클래스의 메쏘드 목록 보기
2013.09.04   [bash][ruby] - 콘솔. 서브 디렉토리 모든 브랜치에 대해서 git pull 하는 스크립트(bash, ruby)


icon powershell 응용
개발/Script | 2013. 12. 23. 14:48

[문제]

현재 폴더에 위치한 서브 폴더 안에 있는 특정 파일을 출력한다.

조건1. 어느 서브 폴더에 있는 것부터 출력하냐면 폴더명 역순으로.


다양한 방법이 있고, 더 간단한 방법도 있을 수 있다.

하지만 파워쉘의 강력한 기능들을 인지하는 차원에서 여러 기능을 활용해본다.


ls | ?{$_.PSIsContainer} | sort -desc | %{pushd $_; if (Test-Path filename) { write-host $_ ':' (cat filename) }; popd}    


설명


ls

Get-ChildItem 의 alias. gci로 해도 되고, dir 로 해도 된다.


? { ... }

? 은 필터 기능이다. 결과물(배열) 중 필요한 녀석만 선택해 새로운 배열로 변환한다.

함수형 언어의 filter 함수라고 보면 된다. { ... } 은 람다로 보면 되고 필터할 조건구문을 서술한다.


PSIsContainer

노드객체의 프로퍼티이다. 속성명이 맘에 안드는데... 해당 노드가 디렉토리면 true, 일반 파일이면 false 를 반환한다.


$_

람다의 디폴트 파라메터 (ls 의 각 요소(파일/디렉토리 노드)들이 들어옴)


sort

정렬 기능인데, -desc 옵션을 주면 역순 정렬임.


% { ... }

foreach 인데 용법 두가지 중 하나. 파이프라인 뒤에 사용하는 foreach 는 앞선 array 들의 각 요소들 마다 람다를 수행한다.


Test-Path

파일이 존재하는지 알아보는 함수. 기타 추가적인 기능이 있을 수 있다.


write-host

command쉘은 echo 에 해당함.

(참고로 powershell 의 echo 는 좀 더 객체지향적인 이해가 가미된 write-host 라고 보면 된다.)


cat

Get-Content 의 alias


(....) // 위에서 (cat ...) 한 구문

bash 의 $(...) 와 비슷하다고 보면 된다. 하지만 파워쉘은 모든 구문이 더 명료하고 직관적이기 때문에 일반적인 언어처럼 쉽게 이해 된다.


pushd

Push-Location 의 alias. command 에도 이런 기능이 있다. cd 와 유사하나, stack 에 기존 폴더를 넣고 해당 폴더로 이동한다.


popd

Pop-Location 의 alias. command 에도 이런 기능이 있다. 스택에 넣어진 폴더로 cd 한다.



Unix 계열의 shell 특히 bash shell 은 매우 훌륭하지만, 너무 고전적이다.

그러한 단점을 모두 극복하고 프로그래머가 더 다루기 좋은 도구로 발전시킨게 PowerShell 이 아닌가 싶다.


bash 에 능숙하다면, powershell 은 더 능숙하게 사용할 수 있을 거라 생각된다.


bash 는 shell 자체 보다는 유명한 unix 커맨드 스크립트를 활용하여 강력한 면이 있지만, 보수적인 면 때문에 답답한 부분도 없지 않아 있다.


bash 도 grep, sed, awk 이런 것들을 pipeline 과 조합하여 강력하게 사용가능하지만, 

powershell 은 그 구시대적인 모든 것을 쉘 자체에서 지원하고 있다.

물론 얼마 되지 않았으므로 더 명료하고 더 간단하면서도 직관적이다.


arrow 트랙백 | 댓글



icon [powershell] 파워쉘 속성 튜토리얼
개발/Script | 2013. 9. 14. 20:44

powershell 3.0 으로 테스트하였습니다.


PowerShell 은 좀 더 발전된 쉘 스크립팅을 지원한다.

텍스트 기반이 아닌 오브젝트 기반이며, 이로써 더 강력한 기능을 쉽게 가능하게 해준다.

이 점이 장점이 될지는 지켜봐야 하겠지만, 비-리눅스 개발자라면 메리트가 충분히 있어 보인다.


이와 같은 shell script 말고 ruby, python 을 shell script 처럼 사용하는 경우도 많지만,

shell script 가 파일경로 및 디렉토리 구조에 대해 쉽게 사용될 수 있도록 특화되어 있기 때문에

익숙하기만 하면 더 짧은 코드로 작성이 가능하다.


powershell 은 윈도우 쉘 답게 명령어에 대소문자를 가리지 않는다.

파라메터 규칙은 보통 -option 과 같은 방식을 따른다.

cmd shell 에서 보통 /option 과 같이 하는 것과 대조된다.

(아마도 윈도우 개발자들도 요즘은 linux 스타일 path 구분자 / 을 사용하는 경우가 많아서 그런게 아닐까 싶다)

이는 unix 계열의 구형 옵션 방식과 유사하다. (요즘은 거의 GNU style 로 통일되는 듯 싶지만)



[[출력해보기]]

echo 'hello'


write-host 'hello'


$your_name = 'name'

write-host "hello ${your_name}"


write-host "hello" ${your_name}

사실 echo 와 write-host 는 엄밀히 다르다.

write-host 가 cmd 의 echo 와 같으며, echo 는 복잡한 개체를 표시할 때 title column 이 표시되는 특징이 있다.



[[현재 폴더 모든 파일명앞에 'value = ' 을 붙여 출력하는 방법 #1]]

foreach($item in gci) { write-host 'value =' $item}


foreach($item in gci | select name) { write-host 'value =' $item.name}

foreach($item in gci | select *) { write-host 'value =' $item.name}


gci 는 Get-ChildItem 의 약자이자 alias 명령어로

dir 및 ls 과 유사하지만, 결과물을 item 목록으로 준다고 보면 된다.(오브젝트 기반 스크립트이므로)

select 는 그 목록 개별 레코드 중 특정 컬럼(오브젝트)만 취하는 것이다.

( bash 으로 하려면 복잡해진다. grep/awk 등 텍스트 파싱을 위한 여러 조합이 나올 것이다 )


object 기반이기 때문에 gci 의 결과물은 객체라 봐도 무방하다.

그래서 $item.name 같이 특정 컬럼(오브젝트)에 멤버 변수처럼 접근하는 것도 가능하다.



[[현재 폴더 모든 파일명앞에 'value = ' 을 붙여 출력하는 방법 #2]]

gci | ForEach-Object{write-host 'value =' $_}

gci | foreach{write-host 'value =' $_}

gci | %{write-host 'value =' $_}

이는 다소 독특한 방법인데, gci 의 출력(파일 리스트)의 요소 각각에 대해서 무언가 다른 작업을 해주는 것이다. ruby 의 .each{ 와 비슷한데 $_ 는 그 해당 요소 하나를 의미한다. 위에서는 $item 이라 보면 된다. % 는 축약형으로 사실은 ForEach-Object 이다. foreach 로도 사용할 수 있다.
(하지만, foreach(...) {} 과 같은 문법을 ForEach-Object 로는 대체할 수 없다!)

이 방법이 foreach(...) {...} 방식보다 쉘스크립트에 더 적합한 것 같다.


[[현재 폴더 모든 파일명 중에 'vim' 이라는 글자가 들어간 경우만 출력하는 방법]]

foreach($item in gci) { if($item.name -like '*vim*') { write-host $item} }


foreach($item in gci) { if($item.name.contains('vim')) { write-host $item} }


gci | %{if($_.name -like '*vim*') { write-host $_ }}



[[오브젝트 멤버 보기]]

python 의 dir. ruby 의 .methods 같은 기능이다.

powershell 은 객체지향이므로 이런 것을 알아두면 공부할 때 도움이 된다.


"text" | get-member // "text" 객체의 member 보기


[string] | get-member // string 타입의 member 보기



/* method 목록만 보기 */


// 맨위에 Name ===== 과 같은 헤더 컬럼명이 생략되는 방법

[string].GetMethods() | select name


// 맨위에 Name ===== 과 같은 헤더 컬럼명이 생략되는 방법(들)

[string].GetMethods() | %{$_.name}


[string].GetMethods() | %{write-host $_.name}


[string].GetMethods() | ft -hide


ft -hide 는 Format-Table -hidetableheaders 의 줄임 명령이다.



arrow 트랙백 | 댓글



icon [ruby] 변수/클래스의 메쏘드 목록 보기
개발/Script | 2013. 9. 9. 21:53

Python 의 dir 과 유사한 것임.

dir(variable)


puts variable.methods.sort

 


arrow 트랙백 | 댓글



icon [bash][ruby] - 콘솔. 서브 디렉토리 모든 브랜치에 대해서 git pull 하는 스크립트(bash, ruby)
개발/Script | 2013. 9. 4. 02:28

1. 모든 브랜치에 대해서 pull 하는 방법

git up ( git pull 대신 사용한다 )


단, git up 은 git-up 을 설치해야만 사용할 수 있다.

git-up 을 설치하려면 


[redhat linux]

sudo yum install ruby            (윈도우의 경우 rubyinstaller 를 통해 설치)

sudo yum install ruby-devel    

gem install git-up


[debian linux]

sudo apt-get install ruby

sudo apt-get install ruby-dev

sudo gem install git-up


2. 모든 서브 디렉토리(repository)의 모든 브랜치에 대해서 pull 하는 스크립트 ( bash ) - 단, 로컬 브랜치가 존재하는 경우만

<<git-all-up.sh>>

#!/bin/bash

for f in $(find $(pwd) -maxdepth 1 -type d) ; do

        if [ -d ${f}/.git ] ; then

                echo '>>> git up ... ' $f

                git --git-dir=${f}/.git --work-tree=${f} up

        fi

done

>> $(...) 하면 ... 의 표준 출력이 값이 된다.

>> ; 하면 줄넘김을 하지 않아도 된다

>> [ ... ] 에는 파일 관련 조건식이 온다. [ -d $f ] 의 경우는 $f 파일(명)이 directory 인지 판단.


3. 모든 서브 디렉토리(repository)의 모든 브랜치에 대해서 pull 하는 스크립트 ( ruby ) - 단, 로컬 브랜치가 존재하는 경우만

<<git-all-up.rb>

#!/usr/bin/ruby

Dir.glob("**").each do |d|

        if File.exists?("#{d}/.git")

                print ">>> git up ... #{d}\n"

                ad = File.expand_path(d)

                system "git --git-dir=#{ad}/.git --work-tree=#{ad} up"

        end

end


이 외에 git 에는 submodule 이라는 개념이 있다.

이에 대해서도 알아볼 필요가 있다.

이를 사용하지 않거나 사용할 수 없는 경우에 위와 같은 방법을 사용한다.

'개발 > Script' 카테고리의 다른 글

powershell 응용  (0) 2013.12.23
[powershell] 파워쉘 속성 튜토리얼  (1) 2013.09.14
[ruby] 변수/클래스의 메쏘드 목록 보기  (0) 2013.09.09

arrow 트랙백 | 댓글



[PREV] [1] [NEXT]
관리자  |   글쓰기
BLOG main image
code heart story
분류 전체보기 (74)
생활 (0)
잡담 (8)
컴퓨터 (11)
개발 (52)
기본 (6)
Linux (21)
Web (4)
Script (4)
Java 기본 (0)
Windows 디버깅 (6)
VC++ (5)
VC++ (윈도우) (5)
VC++ (게임) (0)
VC++ (네트워크) (1)
Code Snippet (0)
Total :
Today :
Yesterday :
rss
위치로그 : 태그 : 방명록 : 관리자
코드하트's Blog is powered by Daum / Designed by plyfly.net