MATLAB 을 사용하여 압축을 하고 싶으면 zip() 이라는 함수를 사용 합니다.

 

현재 폴더의 하위 내용들을 압축하고 싶은 경우 보통은 현재 폴더를 압축하곤 하는데 이렇게 하려면 현재 폴더가 아닌곳에 zip 파일을 저장해야 합니다.

 

오늘은 현재 폴더 하위의 내용들을 압축하는 방법에 대해 소개하려 합니다.

 

현재 폴더의 내용을 검색하는 방법은 dir() 이라는 함수를 사용합니다. dir() 함수는 recursive 한 파일 검색은 되지 않습니다.

 

recursive 한 파일 검색을 하고 싶다면 아래 포스팅을 참조하시면 됩니다.

 

http://iamaman.tistory.com/757

 

아무튼 오늘은 그냥 현재 폴더에 대해서만 검색 할것이므로 dir() 함수를 사용합니다.

 

그런데 dir() 함수를 사용하여 현재 폴더를 검색하면 '.', '..' 라는 폴더가 검색 됩니다.

 

바로 현재와 상위 폴더 입니다.

 

현재 폴더의 하위 내용들을 압축하고 싶기 때문에 그래서 이 부분들을 제외하고 압축을 해야 합니다.

 

위 소개한 부분들을 제외하고 압축을 하는 방법은 아래 코드와 같습니다.

 

a= dir('.');

fileAll=cell(length(a),1);

 

for n=1:length(a)

    if ~(strcmp(a(n).name,'.') || strcmp(a(n).name,'..'))

        fileAll{n}=a(n).name;

    end

end

 

AllFile=fileAll(~cellfun('isempty',fileAll));

zip('CurrentFolder.zip',AllFile);

 


코딩시 찾기 바꾸기는 매우 자주 하는 작업 중의 하나인데요

   

보통 Eclipse 와 같은 IDE(Integrated Development Environment)를 사용하는 경우 Find and Replace 는 너무나 쉬운 작업인데~

   

찾기 바꾸기를 위해 Eclipse 와 같은 IDE 를 일일이 실행 시키는것도 참 귀찮은 일이죠~

   

리눅스 등에서는 sed 와 같은 툴을 사용하지만~ 반복 작업이 아닌 이상은 GUI 환경에서 작업하는게 편하긴 하죠~

   

그래서 찾아보니 아래 주소에 fnr.exe 라는 프로그램이 있더군요.

   

아쉽게도 Cross-platform 은 아니고~ 윈도우에서만 동작합니다.

   

https://findandreplace.codeplex.com/

   

아래 그림과 같이 다운로드를 수행 후 압축을 풀면 fnr.exe 파일이 나옵니다.


위 프로젝트는 아래 주소로 옮겼네요. 


https://github.com/zzzprojects/findandreplace






   

fnr.exe 파일을 실행하면 아래 그림과 같이 Find and Replace GUI 프로그램이 실행 됩니다.



 

Dir 에 텍스트 파일이 들어 있는 폴더를 지정하고 찾을 문구와 바꿀 문구를 넣고 Replace 를 누르면 찾기 바꾸기가 동작 합니다. Find Only를 누르면 찾기만 동작하는 하구요~

 

위 그림에서 보는 바와 같이 fnr.exe 은 GUI, Regular Expression 뿐만 아니라 command 명령으로도 사용 할 수 있습니다.

   

GUI 의 아래 부분에 있는 "Gen Replace Command Line" 버튼을 클릭하면~ 아래 그림과 같이 Command Line 명령으로도 나오는 것을 확인 할 수 있습니다.





 

Command Line 을 사용하면 좀 더 다양한 응용도 할 수 있을 것으로 보이네요~


C/C++ 을 사용하여 우리가 흔히 사용하는 ls 또는 dir 명령과 같이 directory 의 파일 또는 폴더의 리스트를 얻고 싶어서 찾아보니

 

아래 주소의 글이 나오더군요. 역시… stackoverflow

 

http://stackoverflow.com/questions/612097/how-can-i-get-a-list-of-files-in-a-directory-using-c-or-c

 

boost 와 같은 매우 좋은 라이브러리를 사용하는 방법도 있지만 첫번째 답변에 dirent.h 파일을 사용하는 방법이 설명 되어 있었습니다.

 

dirent.h 는 C POSIX library 에 포함되어 있으며 MinGW 나 GCC 등에서는 사용할 수 있지만 Visual Studio에서는 사용할 수 없더군요.

 

http://stackoverflow.com/questions/5530933/dirent-h-in-visual-studio-2010-or-2008

 

사실 이런 파일 리스트와 관련한 함수들은 Cross Platform 으로 구성되어야 코딩하기 편한데 각 플랫폼에 따라 다르게 코딩하는 방법을 알아야 된다는 게 귀찮더군요.

 

그런데 역시.. dirent.h 는 Visual Studio 에서 사용할 수 있도록 아래 주소에 API 가 있었습니다.

 

http://www.softagalleria.net/dirent.php

 

또한 첫 번째로 소개했던 주소에 Visual Studio 에서 사용 할 수 있는 dirent.h 의 링크가 있더군요.

 

http://www.softagalleria.net/download/dirent/

 

몇 가지 파일 중 dirent-1.11.zip 파일을 다운로드 받았고~ Codeblock 을 사용하여 빌드 해 봤습니다.

 

필요하신 분들을 위해 dirent-1.11.zip 파일도 올립니다.

  

dirent-1.11.zip


빌드 후에 아래 그림과 같이 dirTest.exe C:\Windows 라고 명령해서 C:\Windows 의 파일리스트를 확인해 봤습니다.

 

잘 되더군요.

 

MATLAB 에서 여러 개의 텍스트 파일이나 data 파일 등을 dir 명령어를 이용하여 파일 목록을 가져올 있습니다.

 

파일 목록을 가져 후에 for 등을 이용하여 일괄적으로 파일을 열어서 데이터를 가져 오는 것이 가능 합니다.

 

하지만 MATLAB dir 명령은 recursive 하게 동작하는 옵션은 없습니다.

 

이러한 경우에는 MATLAB 에서 운영체제의 명령어를 이용하여 처리하는 것이 좋습니다.

 

윈도우 운영체제에서 도스 명령어를 이용할 경우에는 dos command 같은 형태로 이용합니다.

 

또는 [status, result] = dos('command') 같이 이용하여 dos 명령 실행 결과를 MATLAB 으로 가져 수도 있습니다.

 

이제 현재 폴더에서 모든 txt 파일을 recursive 하게 찾아 보죠~

  

[~, result] = dos('dir /s /b *.txt'); % dos 명령 실행 recursive 하게 최소 형식으로 txt 파일 찾기 실행


filenames = textscan(result,'%s','delimiter',char(10)); %
바꿈(\n) 구분자로 해서 결과를 나눔


filenames2 = filenames{1}; % cell type
으로 파일이름 저장


 

 

코드에서 filenames2 변수에 원하는 txt 파일들의 전체경로가 저장이 됩니다.

 

그럼 for 등을 이용해서 열기만 하면 되는 거죠~


'programming language > MATLAB' 카테고리의 다른 글

MATLAB GUI 창 크기 조절  (4) 2012.03.03
MATLAB GUI  (4) 2012.02.24
MATLAB figure ButtonDownFcn  (0) 2012.02.22
Simulink Algebraic Loop  (0) 2012.02.13
MATLAB dos 명령 사용하기  (0) 2011.12.21
MATLAB convolution  (0) 2011.11.20
Window command 에서 MATLAB 실행 방법  (0) 2011.11.20
MATLAB, end 를 이용한 데이터 추가  (1) 2011.11.18
MATLAB 집합 관련 함수들  (0) 2011.06.13

컴퓨터를 사용하다 보면 특정 용량 이상 또는 특정 용량 이하의 파일들을 걸러 내고 싶은 경우가 있다.

이런 경우엔 단순히 윈도우 탐색기에서 크기에 따라 정렬을 한 이후에 드래그 하여 지우는 방법 등을 쓸 수가 있다.

하지만 같은 폴더내에 특정 확장자의 파일만 지우고 싶은 경우에는 윈도우 탐색기만으로는 부족하다.

이런 경우 powershell 을 이용하면 너무나 간단히 작업을 완료 할 수가 있다.

나의 경우엔 D:\movie_folder 안에 있는 avi 파일 중에서 용량이 100 MB 이하인 파일들을 지우고 싶었다.

위 작업을 수행하는 powershell 코드는 아래와 같다.

 

gci d:\movie_folder\* -Include *.avi | Where-Object -FilterScript { $_.length -lt 100MB } | Remove-Item –Force

 

위 코드에 대해 설명을 해 보자.

  • gci 는 Get-ChildItem 의 alias(별명) 으로서 우리가 흔히 알고있는 dir 과 같은 의미이다. 즉 저장소 내의 하위 항목들을 가져 온다.
  • d:\movie_folder\* 는 찾고자 하는 폴더
  • -Include *.avi 은 avi 파일만 찾겠다는 의미
  • 이에 대해 파이프라인( | ) 으로 연결해서 Where-Object 로 찾고자 하는 조건을 만들어준다.
  • $_.length 은 각 항목들의 크기를 말한다.
  • -lt 는 비교 연산자이다. < 를 의미 하는 것으로 작다 를 나타내는 비교 연산자이다. 100 MB 보다 작은 파일들만 걸러낸다.
  • Remove-Item –Force 는 강제로 삭제하라는 의미다.

 

위 코드에서 비교연산자 부분에 대해 추가적인 설명을 하자면

powrshell 에서는 우리가 흔히 알고 있는 비교 연산자인 > , < , >= 등을 쓰지 않는다.

대신 다음과 같이 문자로 표시 한다.

 

표 1, powershell 비교 연산자

-lt

Less than

작다

-le

Less than or equal to

작거나 같다

-gt

Greater than

크다

-ge

Greater than or equal to

크거나 같다

-eq

Equal to

같다

-ne

Not equal to

같지 않다

-like

Like (uses wildcards for matching)

유사하다

-notlike

Not like (uses wildcards for matching)

유사하지 않다

표 출처: powershell 비교연산자

 


+ Recent posts