2017-09-24 19 views
1

다른 디렉토리에 들어있는 파일을 복사 :쉘 - 재귀 적으로 하위 디렉토리를 찾아 나는 다음 디렉토리 -/파일 구조를 가지고있다

/test 
    /dir_a 
     /dir_pic 
      car.jpg 
      train.jpg 
      thumbs.db 
    /dir_b 
     /dir_pic 
      car.jpg 
      plane.jpg 
      boat.jpg 
    /dir_c 
     /dir_pic 
      ship.jpg 
      space_shuttle.jpg 

나는 다음과 같은 구조를 만들어 파일을 복사하고 싶습니다 :

/test2 
    /c 
     /car 
      car.jpg 
    /b 
     /boat 
      boat.jpg 
    /p 
     /plane 
      plane.jpg 
    /s 
     /ship 
      ship.jpg 
     /space shuttle 
      space shuttle.jpg 
    /t 
     /train 
      train.jpg 

서브 디렉토리를 , 으로 만들었지 만 하위 디렉토리를 만드는 방법과 파일을 복사하는 방법을 모르겠습니다. find /test/ -type d -name ".dir_pic" | xargs -0 -I%%% cp %%%/${i}*.jpg /test2/과 같은 것을 시도했지만 작동하지 않습니다. for-loops가 작동하지 않습니다. 특히 경로에 공백이있는 경우에는 작동하지 않습니까?

필자의 리눅스 지식은 상당히 제한되어 있으므로이 것을 어떻게 실현할 수 있는지 (우분투 16.04 LTS) 도와 주실 것을 부탁드립니다.

+0

왜'train.jpg'가 놓친? – RomanPerekhrest

+0

입력 오류 –

+0

또 다른 순간에는'dir_a'와'dir_b' 모두 서로 다른 이미지를 포함 할 수있는'car.jpg' 파일을 포함하고 있습니다. 어느 것이 선택되어야하며 왜 그럴까요? – RomanPerekhrest

답변

1

bash는 솔루션 :

#!/bin/bash 

dest_dir="/test2"   # destination directory 

for f in $(find /test/ -type f -path "*/dir_pic/*.jpg"); do 
    fn="${f##*/}"   # filename (basename) 
    parent_d="${fn:0:1}" # parent directory 
    child_d="${fn%.*}" # child directory 

    if [[ ! -d "$dest_dir/$parent_d/$child_d" ]]; then 
     mkdir -p "$dest_dir/$parent_d/$child_d" 
     cp "$f" "$dest_dir/$parent_d/$child_d/$fn" 
    fi 
done 

결과보기 :

$ tree /test2 
|-- b 
| `-- boat 
|  `-- boat.jpg 
|-- c 
| `-- car 
|  `-- car.jpg 
|-- p 
| `-- plane 
|  `-- plane.jpg 
|-- s 
| |-- ship 
| | `-- ship.jpg 
| `-- space_shuttle 
|  `-- space_shuttle.jpg 
|-- t 
| `-- train 
|  `-- train.jpg 
+0

질문. 왜 디렉토리 나 파일이 존재하지 않으면'mkdir'과'cp' 만 쓰는가? 각 서브 디렉토리에'mkdir -p' (이미 존재한다면 오류 없음)를 호출하고 최신 버전을 복사하는'cp -ua' (또는'$ child_d "'가 존재하는 동안, 예를 들어'name_01.ext'와 같은 이름의 파일을 복사하고 그 파일을 복사합니까?) –

+0

@ DavidC.Rankin, 다른 폴더에있는 동일한 파일들 - OP는 * 덮어 쓸 수 있거나 무시할 수 있다고 말했습니다 *. "name_01.ext'를 증가 시키거나 생성하지 않고 한 번에 폴더/파일을 필요로 함 – RomanPerekhrest

+1

나는 해결책이 마음에 들었다. 걱정이 없다면 걱정할 필요가 없다고 생각한다 . –