Linux/Linux_technic

Linux - 여러 디렉토리에 있는 파일 한번에 처리하기

sosal 2015. 12. 18. 18:59
반응형

 

/*

 http://sosal.kr/
 * made by so_Sal
 */

 

다음과 같이 수많은 디렉토리들이 존재한다.

 

디렉토리 목록만 출력하는 명령어는 매우 간단하다.

[sosal@sosal tmpFiles]$ ls -ld */
drwxrwxrwx+ 2 sosal sosal 4096 Dec 17 13:17 0d191d48-caea-47ff-b2a6-aa25db419b48/
drwxrwxrwx+ 2 sosal sosal 4096 Dec 17 13:36 0d894622-7acf-4777-8834-c86f65f093f3/
drwxrwxrwx+ 2 sosal sosal 4096 Dec 17 12:43 0fa20077-608b-4ee5-b00c-343992ecd1d0/
drwxrwxrwx+ 2 sosal sosal 4096 Dec 17 09:48 1982a22a-5bea-4475-beef-71674d3f17e0/
drwxrwxrwx+ 2 sosal sosal 4096 Dec 17 06:52 19f76f26-ce70-42fb-8b6a-ee254e45c3bd/
drwxrwxrwx+ 2 sosal sosal 4096 Dec 17 12:02 1b9f522d-8a2b-4d92-86cf-9814a3710d58/
drwxrwxrwx+ 2 sosal sosal 4096 Dec 17 07:23 1c6295c4-b9cf-4387-b402-4ab787f8db5a/
drwxrwxrwx+ 2 sosal sosal 4096 Dec 17 12:10 1cd06ff0-79a6-4006-b70b-b0bf0c7341b4/
drwxrwxrwx+ 2 sosal sosal 4096 Dec 17 09:26 22a5397c-e620-4f24-8603-a83a8cb8789f/
drwxrwxrwx+ 2 sosal sosal 4096 Dec 17 06:40 24e8140e-64bd-4c8f-a3d4-3c90a25ea52c/
(이하 생략)

 

여기서 디렉토리 이름만 dirs라는 파일에 담아 저장하는 방법은 다음과 같다.

[sosal@sosal tmpFiles]$ ls -d */ > dirs

 

dirs를 읽으면 다음과 같다.

[sosal@sosal tmpFiles]$ cat dirs
013f164c-51bc-44f3-94ac-bf8d5f1bb2d1
023d2318-c291-4a37-823c-7fb3d15f65e9
05d3e21a-bd8e-45fe-b313-4ddca9cdc4f7
124f6aaa-d9f1-4c60-a54b-f967942064de
1451adb6-cf32-4bfb-8364-7fd0d197775f
188093e3-e1e6-4974-b140-0d92debc3c22
19bdfb90-2b14-46e6-83cd-bf766cac6b1e
1a0420e0-0417-42ec-a87a-c3e77dfadc9c
1a179d67-8165-4c45-8fac-9b45d74b7ac1
1b1d5874-e899-4da5-b82e-89a329b643d8
1d542e8b-fc2c-4e89-b024-4b8f9e8e4635
22dd9910-5a25-4c97-b290-98e730ff3a42
26a03f1f-f4e2-4dd5-a8b0-b8cdea2e0b55
2ae8b6c3-99bd-4fe9-a97b-a9026155259f
............. (이하 생략)

 

 

 

 

 

- 조건

현재 디렉토리에, 다른 디렉토리가 약 1000개 넘게 존재하며, 각각 디렉토리에는 파일 2개가 존재한다.

위의 디렉토리 목록에 들어있는 파일을 현재풀더로 옮기는 작업을 하고자 한다.

 

 

 

해야 할 행동은 4가지로 나눌 수 있다.

 

1. dirs 파일을 읽어, 모든 디렉토리 이름을 가져온다.

2. 읽은 각 줄의 디렉토리 이름에 따라 cd 명령어로 이동한다.

3. 모든 파일을 원하는 곳으로 이동시킨다. (여기서는 각 디렉토리의 상위폴더)

4. 다시 상위 디렉토리로 돌아와서 2번을 반복한다.

 

해당 내용을 쉘 스크립트로 구현하면 다음과 같다.

 

cat dirs | while read line; do cd $line; mv * ../; cd ..; done

 

 

위의 스크립트를 개행하여 나타내면 매우 쉽게 이해할 수 있다.

 

cat dirs # dirs 파일을 읽어, 모든 디렉토리 이름을 가져온다.

while read line; # 읽은 각 줄의 디렉토리 이름에 따라

    do cd $line; # cd 명령어로 이동한다.

    mv * ../; # 모든 파일을 원하는 곳으로 이동시킨다.

    cd ../; # 상위 디렉토리로 돌아간다. (while을 다시 반복한다.)

done

 

while loop 안에 있는 쉘 스크립트만 살짝 수정하면 쉽게 응용할 수 있다.