2017-04-25 5 views
1

쉘 : 나는 지정된 파일을 복사 할 수있는 방법 파일 이름에서 N 주요 구성 요소를 제거 전체 폴더 구조와 파일의 복사 목록

/root/ 
/root/lib/ 
/root/lib/dir1/ 
/root/lib/dir1/file1 
/root/lib/dir1/file2 
/root/lib/dir2/ 
... 

에 (제한적 아니라) 유사한 파일의 목록 (예 : files.txt)를 고려 에서 제거의 예 단지 /root/)에서 가) 그대로 폴더 구조 하지만B) N 폴더 구성 요소와 내 선택의 위치 (예 : ~/destination)에 (도 지정되어있는 폴더에서되지 않은 다른 콘텐츠() 경로?

나는 이미 내가 ~/destination/...

+0

항상'/ root /'가 제거 될 것입니까? –

+0

"하드 코딩 할 수 있습니까?" 그렇다. 그것은 때때로 다른 경로 일 수도 있고 (가능하다면) 나는'cd'를'root'로 피하기를 원합니다. 그래서 그것을 사용하고자하는 곳의 스크립트는 결국 작업 디렉토리를 가지고 놀 필요가 없습니다. –

+0

이 예에서'/ root/lib/dir1 /'을 사용했다면 그 디렉토리 내의 모든 파일을 복사합니까? '/ root/lib/dir1/file1'도 지정합니다. 그러나 이것은 이미 이전 행 때문일 것입니다. 그 맞습니까? –

답변

1

은 내가 GNU tar를 사용하여 정말 좋은 간결한 해결책을 찾은 것 같아요 :

tar cf - -T files.txt | tar xf - -C ~/destination --strip-components=1 

참고 파일 이름의 시작 부분에서 경로 구성 요소의 임의의 번호를 제거 할 수 있습니다 --strip-components 옵션을 선택합니다.

한 가지 사소한 문제가 있지만 : tar 항상 (내가 폴더를 무시하는 옵션을 찾을 수 없습니다 적어도) files.txt에서 언급 한 폴더의 전체 내용을 "압축"보인다,하지만 가장 쉽게이다 grep를 사용하여 해결 :

cat files.txt | grep -v '/$' > files2.txt 
0

에서 그들을 가지고 싶습니다 그러나이 ~/destination/root/...에서 끝나는 모든 파일 결과, 손상되지 않은 폴더 구조로 파일을 복사 할

cp --parents `cat files.txt` ~/destination 

을 사용하여 관리 이것은 가장 우아한 해결책이 될하지 않을 수 있습니다 -하지만 그것은 작동 :

for file in $(cat files.txt); do 
    echo "checking for $file" 
    if [[ -f "$file" ]]; then 
     file_folder=$(dirname "$file") 
     destination_folder=/destination/${file_folder#/root/} 
     echo "copying file $file to $destination_folder" 
     mkdir -p "$destination_folder" 
     cp "$file" "$destination_folder" 
    fi 
done 

내가 cp과 012에보고했다이지만 처음에는 cd/root을 입력하면 더 많은 혜택을 볼 것으로 보입니다.

그러나 올바른 디렉토리에 이전에 cd을 작성했다면, 서브 쉘이 완료되면 원래 위치로 되돌릴 수 있도록 항상 서브 쉘로 실행할 수 있습니다.

+0

감사합니다. 정상적으로 작동하는 것처럼 보입니다! –