히비스서커스의 블로그

[Linux] 여러 파일들 특징에 맞는 여러 디렉토리에 옮기는 shell script 작성방법 (feat. 8: Bad substitution) 본문

Programming/Linux

[Linux] 여러 파일들 특징에 맞는 여러 디렉토리에 옮기는 shell script 작성방법 (feat. 8: Bad substitution)

HibisCircus 2022. 3. 21. 17:18
728x90

https://blog.sonim1.com/58

디렉토리 구조

~/
├ test_001.csv  # 첫번째 csv 파일 
 .
 .
 .
├ test_100.csv  # 100번째 csv 파일
├ 001  # 1번째 디렉토리
 .
 .
 .
└ 100  # 100번째 디렉토리

 

목표 

test_001.csv는 001에, test_100.csv는 100에 옮기는 것이 목표이다.

 

 

해결방법

1) 해당 코드가 적힐 스크립트 파일 만들기

$ vi mv_csv.sh

 

2) 코드 작성

#!/bin/bash

### 공통된 path부분을 test_dir로 할 것임
test_dir=~

### 해당 path에 모든 csv 파일들의 경로를 하나씩 불러와서 (ex. ~/test_001.csv)
for test in $test_dir/*.csv

### 하나의 경로에서 7번째부터 3글자를 불러옴 (ex. sudo mv ~/test_001.csv ~/001)
do
	sudo mv $test ~/"${test:7:3}"
done

 

3) 스크립트 실행

$ sh mv_csv.sh

 

bonus 1) 뒤에서 부터 출력 시

### 코드
$ string=test_back
$ echo "${string: -4:4}"

### 결과
back

: 뒤에 한칸을 띄어야 하는 것이 포인트이다.

 

bonus 2) 문자의 길이 출력

### 코드
$ string=four
$ echo ${#string}

### 결과
4

 

 

문제 발생

8: Bad substitution

 

원인을 찾아보니 mv_csv.sh의 실행권한이 없어서였다.

 

해결방법

$ sudo chmod +x mv_csv.sh

 

bonus +) 해결이 안될 시

shell 언어가 sh가 아닌 다른 shell일 수 있으므로 체크해본 후

 

### 코드
$ readlink -f $(which sh)

### 결과
/bin/dash

 

bash 명령어로 파일을 실행해 보자.

$ bash mv_csv.sh

 

잘 해결되었다. ^^

 

 

 

-히비스서커스-

2022.03.29 뒤에서 부터 출력 및 문자열 길이 출력, 다른 해결방법 추가

728x90