bash script2020. 12. 16. 17:41

 

반달가면 이글루에서 백업 - bahndal.egloos.com/467202

 

shell script를 만들어 쓰다 보면 파일의 특정 행을 읽어서 이 행의 문자열들을 하나씩 가져다가 작업을 해야 하는 경우가 종종 생긴다.

 

 

예를 들어 people.txt에 이름과 이메일이 아래와 같은 형태로 저장되어 있다고 하자. 이름과 이메일 사이는 콜론(:)으로 구분한 경우이다.

 

john:john@mail.com

jane:jane@mail.com

 

이 파일에서 2번째 행, 즉 jane의 정보를 가지고 뭔가 작업을 하려고 한다면 script에 아래와 같은 내용이 들어갈 수 있다. (sed 명령에 대한 내용은 이전 게시물을 참고하자)

 

# people.txt에서 2번째 행을 뽑아서 data_str 변수에 저장

data_str=`sed -n 2p people.txt`

# 첫번째 필드를 name 변수에 저장

name=`echo $data_str | cut -d':' -f1`

# 두번째 필드를 email 변수에 저장

email=`echo $data_str | cut -d':' -f2`

# 이제 작업 시작

...

 

위의 예시는 별 문제가 없지만, 만약 구분자를 탭(tab)으로 사용한 파일을 다룰 때는 문제가 발생한다. 예를 들어 jane:jane@mail.com 대신 jane[탭]jane@mail.com 이런 형식으로 저장된 파일이라면 echo 명령으로 변수값을 출력할 때 잊지 말고 따옴표를 사용해 주자.

 

echo "$data_str" 이런 식으로 해야 한다. 따옴표를 사용하지 않으면 탭이 공백(space)으로 대체된다.

 

# data_str 변수에 jane[탭]jane@mail.com이 할당된 경우

echo $data_str

# 결과는 jane jane@mail.com (탭이 사라지고 공백으로 대체)

echo "$data_str"

# 결과는 jane[탭]jane@mail.com (탭이 보존됨)

 

따라서 탭을 구분자로 사용한 파일을 가지고 작업을 할 때는 앞의 예시가 아래와 같이 변경되어야겠다.

 

data_str=`sed -n 2p people.txt`

# data_str 변수로 받은 문자열의 구분자가 탭인 경우

# 첫번째 필드를 name 변수에, 두번째 필드를 email 변수에 저장

# cut 명령의 기본 구분자가 탭이므로 -d 옵션 불필요

name=`echo "$data_str" | cut -f1`

email=`echo "$data_str" | cut -f2`

 

성격이 꼼꼼하지 못해서 그런지 몇번이나 따옴표를 빼먹는 실수를... -_-;

 

 

728x90
Posted by 반달가면
샷컷(Shotcut) 기초2020. 12. 4. 15:07

 

샷컷(Shotcut)에서 타임라인에 올라가 있는 비디오/오디오에 다양한 효과를 적용할 수 있다. 필터(filter) 기능을 이용하면 된다.

타임라인에서 필터를 적용할 대상을 마우스 왼쪽 클릭해서 선택한 후에, 실행창 상단에 "Filters" 버튼을 누르면 필터를 추가할 수 있는 메뉴가 왼쪽 상단에 표시된다. 여기서 "+" 버튼을 클릭해서 필터를 선택한다.

 

이미 적용된 필터를 제거하려면 "+" 버튼 옆에 있는 "-" 버튼을 클릭하면 된다.

필터는 3가지로 분류되어 있는데, "Favorite(즐겨찾기)", "Video(비디오)", "Audio(오디오)" 등이다. Video와 Audio 항목중에 자주 쓰는 필터를 골라 "*" 버튼을 클릭하면 Favorite에 추가된다.

어둡다가 점점 밝아지는 "Fade in Video", 반대로 점점 어두워지는 "Fade out Video", 소리가 없었다가 점점 커지는 "Fade in Audio", 소리가 점점 작아지는 "Fade out Audio", "Brightness(밝기)", "Contrast(대비)" 등 갖가지 종류의 효과가 제공된다.

필터를 선택하여 추가하면 해당 필터에 대한 세부 설정을 조정하는 메뉴가 추가로 표시된다. 적당히 조절하면서 시험해 보면 되겠다. 

 

728x90
Posted by 반달가면
bash script2020. 12. 2. 15:28

 

반달가면 이글루에서 백업 - bahndal.egloos.com/465115

 

조건에 맞는 파일을 찾아 특정 디렉토리로 복사를 하고 싶을 경우, find와 cp 명령을 xargs 명령으로 연결하면 되겠다.

파일을 찾기 위한 find 명령에 대한 내용은 이전 게시물을 참고하자.

 

우선 홈디렉토리(~/)에서 확장자가 txt인 파일을 찾는 예시를 보자.

 

find ~/ -type f | grep "\.txt$"

 

자, 이 결과를 가져와서 cp 명령을 실행해야 한다. 앞에 실행한 명령의 결과를 뒤에 실행할 명령의 인자(argument)로 넘겨주는 xargs 명령을 이용하는데, 한가지 유의할 점이 있다. 아래의 예시를 보자.

# txt 파일을 찾아 ~/Documents 디렉토리로 복사 (잘못된 시도)

find ~/ -type f | grep "\.txt$" | xargs cp ~/Documents

# 실패!

 

위와 같이 하면 제대로 복사가 되지 않는다. cp 명령에서 복사하려는 목적지 디렉토리와 앞의 find 명령에서 넘어온 파일 목록이 혼동되지 않도록 반드시 -t 옵션을 사용해야 한다. 제대로 된 예시는 아래와 같다.

 

# txt 파일을 찾아 ~/Documents 디렉토리로 복사(성공)

find ~/ -type f | grep "\.txt$" | xargs cp -t ~/Documents

 

728x90
Posted by 반달가면
bash script2020. 11. 26. 14:05

 

반달가면 이글루에서 백업 - bahndal.egloos.com/456590

 

용량이 큰 텍스트 또는 바이너리 파일을 분할하거나 재조립할 필요가 있을 때, split 명령과 cat 명령을 활용하면 되겠다. 

split 명령의 형식은 아래와 같다. 

split [options] file prefix

 

우선 텍스트 파일을 분할해 보자. 예를 들어 myfile.txt 파일을 100행 단위로 잘게 나누어 myfile_part로 시작되는 파일명으로 저장하는 경우다. 터미널창에서 아래와 같이 입력해 보자. -l 옵션으로 나눌 행(line) 단위를 지정하면 된다.

 

split -l 100 myfile.txt myfile_part

 

나누어진 결과는 myfile_partaa, myfile_partab,... 이런 식으로 저장된다.

 

기본 순서가 aa, ab, ac 이런식으로 정해지는데 알파벳이 싫으면 수자를 이용해서 00, 01, 02 이런 식으로 순서를 표시할 수도 있다. -d 옵션을 사용.

 

split -d -l 100 myfile.txt myfile_part

 

결과 파일은 myfile_part00, myfile_part01,... 이런 식이 될 것이다.

 

만약 번호 자리수를 늘리려면 -a 옵션을 사용하자. -a 3 이렇게 하면 세자리로 늘어난다.

 

split -d -a 3 -l 100 myfile.txt myfile_part

 

결과 파일은 myfile_part000, myfile_part001,... 이런 식이다.

 

바이너리 파일은 행 단위가 아니라 바이트(byte) 단위로 분할한다. -l 옵션 대신 -b 옵션을 사용하면 되겠다. 크기 설정에 킬로(k), 메가(m), 기가(g) 등 단위도 사용 가능.

 

myfile.bin 파일을 100kb 단위로 분할하는 예시는 아래와 같다.

 

split -d -a 3 -b 100k myfile.bin myfile_part

 

재조립 요령은 텍스트/바이너리 상관 없이 동일하게 cat 명령을 사용하면 된다. 앞의 예시에서 분할된 파일을 재조립하려면 터미널창에서 아래와 같이 입력한다.

 

cat myfile_part* > myfile_merged

 

마음의 평화를 위해 파일 순서를 명시적으로 맞추고 싶다면 아래와 같이 sort 명령을 같이 사용할 수도 있긴 한데, 굳이 이렇게 하지 않아도 큰 문제 없이 잘 합쳐지는 것 같다.

 

ls myfile_part* | sort | xargs cat > myfile_merged

 

 

728x90
Posted by 반달가면