1. 묶고 풀기 ( tar )

☞ tar 명령은 파일을 묶는 명령이다. 

원래는 백업을 위해 테이프백업 장치인 DAT  Device 에 백업을 할 때 쓰는 명령이었지만, 요즘은 파일의 압축이나 묶기에 더 많이 쓰이는 편이다. 

압축명령에는 compress 나 gzip 이 따로 있지만 tar 명령으로 통합해서 쓰면 편리하고 좋다. 우선 파일을 묶는 방법에 대해 알아 본다.


- tar 명령으로 파일을 묶을 때는 주의해야 할 것이 있는데 바로 디렉토리 단위로 묶는 것이다. 공개 자료실등에서 tar 파일을 받아서 풀 경우 디렉토리 단위로 묶지 않은 파일이면 수십개의 파일이 풀려 나와 디렉토리가 엉망이 되니 신경을 써야 된다. 

- tar는 아카이브 안의 파일에 대한 소유권과 허가권을 그대로 가지고 있으며, 심볼릭 링크나 하드링크, 디렉토리 구조를 유지한다. 뒤에 나오지만 이런점 때문에 tar를 이용해서 시스템 내에서의 데이터의 이동이나 복사에 자주 사용된다. 


  • 묶기
    $ tar cvf 생성_파일명.tar 대상 파일명(또는 대상 디렉토리)
  • 풀기
    $ tar xvf 생성_파일명.tar 


ex) 

$ tar cvf doc.tar doc/

$ tar xvf doc.tar


☞ tar 파일의 종류는 다음과 같다.

  • *.tar       <-- 일반적으로 tar로만 묶었을 때
  • *.tar.Z     <-- compress 로 압축했을 때
  • *.tar.z     <-- gzip 으로 압축(gunzip으로 푼다)
  • *.tar.gz    <-- gzip 으로 압축(gunzip으로 푼다)
  • *.tgz       <-- gzip 으로 압축(gunzip으로 푼다) 


2. 압축, 압축풀기

☞ 압축은 compress 나 gzip 등의 명령을 쓰면 된다. 

  • compress를 이용한 압축(*.tar.Z)
    $ compress 대상파일명.tar
  • uncompress를 이용한 압출풀기
    $ uncompress 대상파일명.tar.Z 


  • gzip을 이용한 압출(*.tar.gz)
    $ gzip 대상파일명.tar 
  • gunzip을 이용한 압축풀기
    $ gunzip 대상파일명.tar.gz


- 각각의 경우에서 뒤의 확장자 .Z .gz가 붙고 떨어지는 것을 주의 깊게 봐야 한다. 

- 파일을 풀기 전에 tar 파일의 내용을 알고 싶을 때 직접 풀지 않고 내용을 보려면 -t 옵션을 주어 풀기를 test 할 수 있다.

ex)  $ tar tvf 대상 파일명.tar


3. 동시수행

☞ tar 명령으로 묶기와 압축을 동시에 수행할 수 있다. 

아래와 같이 tar 명령에서 z 옵션을 주면 된다. 하지만 사용되는 OS에 따라서 z옵션이 지원되지 않는 경우도 있다.


  • 동시 수행
    $ tar cvfz 생성파일명.tgz  대상파일/
    $ tar xvfz 대상파일명.tgz
    $ tar tvfz 대상파일명.tgz


  • 파이프를 이용한 압축 (*.tgz)
    $ tar cvf - 대상파일/ | gzip > 생성파일명.tgz 
  • 파이프를 이용한 압축풀기
    $ gunzip -c 대상파일명.tgz | tar xvf - 


  • 묶어서 디렉토리 옮긴 후 풀기 
    $ tar cvf - 대상파일명 | ( cd 디렉토리명 ; tar xvf - ) 
리눅스 환경 작업을 하다가 보면 vi 에디터를 사용해야 하고,
익숙하지 않은 경우에는 정말 불편한게 vi 에디터다...
물론 익숙해지면 정말 쓰기 편하지만.^^;;;

억지로라도 익숙해질 수 밖에 없기에
과감히 vi 에디터 윈도우용을 설치해서 사용하고 있다.

초기에 설정을 하는 부분이 조금 많아서 필자도 이래저래 찾기바빴다.
하긴 설정파일을 복사해서 가지고 다녀도 되지만 혹 필자처럼 찾는 사람에게 도움이 됐으면 하는 마음과
혹시나 나중을 위해서라도 설정부분을 올려놓으려 한다.

설정파일 위치는 설치폴더에 가면 _vimrc 이란 확장자가 없는 파일이 존재한다.(포터블 버전 역시 마찬가지~)
이부분에 추가해 주면 된다. 필자도 이제 막 사용하는 터라 모자란 부분과 설명은 조금씩 추가해 갈 예정이다.

""""""""""""""""""""""""""""""""""""""""""""""""
" 추가 설정
""""""""""""""""""""""""""""""""""""""""""""""""
set guifont=Bitstream_Vera_Sans_Mono:h9    " 표시 폰트 설정
set fencs=ucs-bom,utf-8,cp949                    " 파일 읽을 때 인코딩 설정
set ai                    " 자동 들여쓰기를 설정
"set autoindent       " 자동 들여쓰기 - 이렇게 써도 된다.
"set smartindent     " 역시 자동 들여쓰기
set shiftwidth=4      " 들여쓰기 폭을 설정
set tabstop=4         " 탭의 폭을 정합니다.
set et                    " 탭을 스페이스로 대체합니다.
set visualbell         " 경고 소리를 화면 깜빡임으로 대체
"set novisualbell    " 비주얼벨 기능을 사용하지 않음
set nu!                 " LineNumber 표시
syntax on             " 구문강조 표시
color desert          " 컬러스킴 설정
set nobackup        " 백업파일을 만들지 않음
set nocompatible   " Vim 디폴트 기능들을 사용함
set backspace=2   " 삽입 모드에서 백스페이스를 계속 허용
set textwidth=90     " 86번째 칸을 넘어가면 자동으로 줄 바꿈
set nowrapscan    " 찾기에서 파일의 맨 끝에 이르면 계속하여 찾지 않음
set nojoinspaces   " J 명령어로 줄을 붙일 때 마침표 뒤에 한칸만 띔
set ruler               " 상태표시줄에 커서 위치를 보여줌
set showcmd       " (부분적인) 명령어를 상태라인에 보여줌
set showmatch    " 매치되는 괄호의 반대쪽을 보여줌
set ignorecase     " 찾기에서 대/소문자를 구별하지 않음
set incsearch       " 점진적으로 찾기
set autowrite        " :next 나 :make 같은 명령를 입력하면 자동으로 저장
set linespace=3    " 줄간격
set title                " 타이틀바에 현재 편집중인 파일을 표시 "

1. library 추가

- version 1.1 이상 필요

- commons-fileupload.jar

- commons-io.jar


2. Bean 주입 ( applicationContext.xml )

-[bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" /]

- 이부분에 대한 추가적인 설정이나 설명은 각자 찾아보길 바란다.


3. Source part

// 파일 첨부를 위해 추가 import 구문

import org.springframework.util.FileCopyUtils;

import org.springframework.web.multipart.MultipartFile;

import org.springframework.web.multipart.MultipartHttpServletRequest;

import org.springframework.web.multipart.commons.CommonsMultipartResolver;


public class ActionClassName extends MappingDispatchActionSupport {


       private CommonsMultipartResolver cResolver;

       // Multipartrequest를 컨트롤하는 객체를 주입받는다.

       cResolver = (CommonsMultipartResolver) getWebApplicationContext().getBean("multipartResolver");    

       

       public ActionForward adminGoodStoreSave(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {


        MultipartHttpServletRequest mrequest = cResolver.resolveMultipart(request);

        String realPath      = request.getSession().getServletContext().getRealPath("/");    // 실제 서버의 주소는 이런식으로 가져올 수도 있다.

        String uploadPath    = realPath + customPath;


          // Multipartrequest 에서 파일 객체부분을 가저온다.

        Map fileMap = mrequest.getFileMap();


        for (Iterator it=fileMap.entrySet().iterator(); it.hasNext();) {

            Entry entry      = (Entry)it.next();

            MultipartFile mf = (MultipartFile)entry.getValue();


            if (!mf.isEmpty()) {

                if(mf.getSize() > 0){

       

                    // 원본 파일명

                    String originalFilename = mf.getOriginalFilename();

                    // 새로운 파일명은 시간(밀리세컨드까지)으로 변경하고 

                    // 확장자만을 갖는다.

                    String newFilename =  System.currentTimeMillis() + originalFilename.substring(originalFilename.length() -4, originalFilename.length());;


                    File fOri = new File(uploadPath, newFilename);


                    // 실제 파일을 작성한다.

                    InputStream is = mf.getInputStream();

                    OutputStream os = new FileOutputStream(fOri);

                    FileCopyUtils.copy(is, os);


                    /* 

                     * 여기에서 파일 필드를 구분하여 처리를 한다.

                     * mf.getName() 또는 entry.getKey().toString() 으로 

                     * input Tag의 name을 확인할 수 있다.

                     */

                    if"file1".equals(mf.getName()) ) {

                            /* 파일 필드1에 대한 처리 구역 */

                    } else if"file2".equals(mf.getName()) ) {

                            /* 파일 필드2에 대한 처리 구역 */

                    } else if"file3".equals(mf.getName()) ) {

                            /* 파일 필드3에 대한 처리 구역 */

                    }


                    os.close();

                    is.close();


                }

            }

        }

        return mapping.findForward(Constants.SUCCESS_KEY);

    }

       

}

       

       

4. JSP Tag part

<html>

<head>

</head>

<body>

....

<tr>

<td align="center" width="100">첨부1</td>

<td colspan="3"><input type="file" name="file1" id="file1"></td>

</tr>

<tr>

<td align="center" width="100">첨부2</td>

<td colspan="3"><input type="file" name="file2" id="file2"></td>

</tr>

<tr>

<td class="rowtitle" align="center" width="100">첨부3</td>

<td colspan="3"><input type="file" name="file3" id="file3"></td>

</tr>

...

</body>

</html>


+ Recent posts