2012-09-12 3 views
0

필자는 bash를 사용하여 스크립팅의 세계를 연구하기 시작했고 외부 플래시의 백업 위치에 하위 폴더가 들어있는 폴더의 내용을 복사하는 간단한 스크립트를 작성하려고합니다. 드라이브 (Thunderbird의 데이터를 백업하려고 시도). 몇 가지 자습서를 살펴본 결과, 스크립트에서 상위 디렉토리로 이동하는 방법에 대한 문제가 있습니다. 복사하려는 폴더가 스크립트 파일이있는 위의 디렉토리 1에 있습니다. 내가 백업 업을하는 두 개의 상위 디렉토리를 통해 ... 여기있어 하드 드라이브에 도착하려면 내가 만든거야 (I 우분투를 12.04를 실행 해요) :이 프로그램을 실행할 때Bash 스크립트 : 디렉토리를 외장 드라이브에 복사 - 디렉토리를 탐색하는 방법?

#! /bin/bash 

#this attepmts to copy the profile folder for Thunderbird to the backup drive 
echo "...attempting to copy Thunderbird Profile to back-up drive (My Passport)" 

#attempt to backup two directories to where media folder (and therefore My Passport is located) 
parent=$(dirname $PWD) 
grandparent=$(dirname $parent) 
greatgrand=$(dirname $grandparent) 

#show what directories the variables are set to 
echo "...parent: $parent" 
echo "...grandparent: $grandparent" 
echo "...greatgrand: $greatgrand" 

echo "...copying..." 

#FIRST SUBSHELL 
#create a subshell and cd to directory to copy && tar directory 
#tar: -c = create tarball, -f = tells it what to create " - " = is the unix convention for stdout (this goes with the -f) " . " = means the whole directory. I the end this first subshell is creating a tarball and dumping it in stdout 
# | = pipe 
#SECOND SUBSHELL 

(cd /mcp/.thunderbird/lOdhn9gd.default && tar -cf - .) | (cd $greatgrand/media/My Passport/Gmail_to_Thunderbird_Backup && tar -xpf -) 

내가 얻을 :

[email protected]:~/BashScriptPractice$ ./thunderProfileBU.sh 
...attempting to copy Thunderbird Profile to back-up drive (My Passport) 
...parent: /home/mcp 
...grandparent: /home 
...greatgrand:/
...copying... 
./thunderProfileBU.sh: line 23: cd: //media/My: No such file or directory 
./thunderProfileBU.sh: line 23: cd: /mcp/.thunderbird/lOdhn9gd.default: No such file or directory 

"/ mcp"디렉토리에서 시작해야합니다. 위의 첫 번째 하위 스크립트 (마지막 줄)에서 필요하지 않다고 추측하고 있지만 "cd /.thunderbird/lOdhn9g ..."를 사용하려고했을 때 오류가 계속 발생했습니다. 두 번째 하위 스크립트에서 나는 어떤 일이 일어나고 있는지 정확히 알지 못합니다. 폴더 탐색 구문을 잘못 이해하고 있습니까?

또한 이것은 부차적 인 질문이지만 소프트웨어 개발자가해야 할 일을 알고 있거나 시스템 관리자에게 더 많은 일을하도록하는 방식으로 스크립팅하고 있습니까? 어떤 스크립팅 수업도 듣지 못했거나 대학을 통해 제공되는 것을 알고 있지만 흥미롭고 유용한 방법을 알 수 있습니다 ... 감사합니다!

+0

있습니까? –

+0

rsync에 익숙하지 않습니다. 그게 bash 유틸리티인가요? 편집 : 그냥 그것을 보았다. 매우 흥미로운. 나는 스크립트를 통해 그것을 구현하는 데 흥미로울 것이다. 비록 내가 여전히 다른 디렉토리를 탐색하는 데 문제가 있을지 모르지만 ... – MCP

+0

스크립트 상단에'set -x'를 넣으면 각 명령을 출력 할 수있다. 실행되고 확장되며 디버깅 할 때 큰 도움이 될 수 있습니다. 완료되면 꺼내십시오. – meowsqueak

답변

1

dirname을 사용하여 각 디렉터리의 부모를 얻는 대신 ..을 사용할 수 있습니다. $greatgrand은 간단히 ../../..입니다.

이제 부모 디렉토리를 스크립트에 의존하는 것은 종종 존재한다는 것을 보증해야하기 때문에 나쁜 생각입니다.

은 스크립트가 실패 두 곳있다 : 그것은 공백이 포함되어 있기 때문에

./thunderProfileBU.sh: line 23: cd: //media/My: No such file or directory 

당신은 디렉토리 이름을 보호해야한다, 그리고 공간이 인수 분리기입니다.

./thunderProfileBU.sh: line 23: cd: /mcp/.thunderbird/lOdhn9gd.default: No such file or directory 

복사 할 디렉토리가 존재하지 않습니다. 대신 ~mcp 또는 /home/mcp을 원한다고 생각합니다.당신이 원하는 것은 외부 드라이브에 썬더 버드의 기본 백업의 경우

, 당신은 rsync 사용해야합니다`rsync`를 사용하지 않는 이유가

# Make sure directory exists 
mkdir -p "/media/My Passport/Gmail_to_Thunderbird_Backup" 
# Copy the contents recursively 
rsync -av "~/.thunderbird/lOdhn9gd.default/" "/media/My Passport/Gmail_to_Thunderbird_Backup" 
+0

시간 내 주셔서 감사합니다. 매우 도움이되는 모든 것. 나는 rsync를 더 자세히 살펴볼 것입니다. 정확히 ~가 무엇을하는지 ... – MCP

+1

'~'는'$ HOME' 환경 변수에 의해 반환 된 홈 디렉토리를 나타냅니다. 어떤 사용자의 홈 디렉토리에 접근하려면'~ mcp' 나'~ root'와 같은 사용자 이름을 사용하십시오. –

1

우선, 더 복잡한 타르 파이프 라인 대신 cp -r을 사용하는 것이 좋습니다. 이는 네트워크에서 복사하는 경우에만 유용합니다.

둘째, 스크립트에 두 가지 문제점이 있습니다. 지정한 소스 디렉토리가 /mcp이고 /home/mcp이 아니므로 찾을 수 없습니다. 두 번째 문제는 지정한 대상 디렉토리에 공백이 있음을 나타냅니다. 그 공간은 공간 앞에 백 슬래시 (\)를 사용하거나 따옴표로 전체 디렉토리를 둘러싼 중 하나로 이스케이프해야합니다

"$greatgrand/media/My Passport/Gmail_to_Thunderbird_Backup" 

난 당신이 상대 경로 ("greatgrand")를 사용하는 이유를 모르겠습니다. /으로 시작하면 절대 경로를 사용하는 것이 더 나을 것 같습니다. greatgrand 디렉토리를 실제로 참조하려면 ../../../을 사용하십시오. 각 ../은 한 단계 올라갑니다.

+0

고마워요. 기본적으로 tar 파이프 라인을 사용하고 있었는데 그 이유는 튜토리얼을 발견했기 때문입니다. 원래 나는 "cp"로 시작했다. 내가/mcp를 놓쳤다는 것을 믿을 수 없다! 또한 나는 그 공간에 따옴표 나 백 슬래시가 필요하다는 것을 알지 못했습니다. 훌륭한 정보. 감사. – MCP

관련 문제