상대 경로 없이 디렉터리 내용을 루트 디렉터리에 복사합니다.

상대 경로 없이 디렉터리 내용을 루트 디렉터리에 복사합니다.

나는 다음과 같은 구조를 가지고 있습니다 :

root_directory/  
          foo  
          bar/
             x/
               a.txt
               b.txt  
             y
             .a_file
           scripts/
                my_script.sh  

복사 하려는 my_script내용은 bar/x" root_directory
사용하는 경우:
cp -r ../bar/x ..디렉토리 외부에서 스크립트를 실행하면 중단됩니다 scripts. "입니다.

Mac과 Linux 모두에서 작동하도록 하려면 어떻게 해야 합니까?

답변1

또는 상대 경로를 선호하는 경우 스크립트 경로가 포함된 배열 변수를 사용하여 스크립트 디렉터리의 절대 경로를 결정할 수 있습니다 BASH_SOURCE.

scripts=$(cd "$(dirname "${BASH_SOURCE[0]}")"; pwd)
cp -R "$scripts"/../bar/x "$scripts"/..

GNU는 or 를 cp사용해도 상관하지 않지만 -rBSD 매뉴얼 페이지에는 권장되지 않는 것으로 나열되어 있으므로 다음을 사용하는 것이 더 좋습니다.-R-r-R

유틸리티의 기록 버전에 대한 옵션이 cp있습니다 -r. 이 구현은 이 옵션을 지원하지만 특수 파일, 기호 링크 또는 FIFO를 올바르게 복사하지 않으므로 사용하지 않는 것이 좋습니다.

답변2

명령은 bar/x표시된 대로 작업 디렉터리 위에 있는 디렉터리의 내용을 복사하도록 지시합니다 ../bar/x. 해당 디렉토리에 없으면 그 위에 있지 않으므로 scripts작동하지 않습니다 . bar/x시스템의 다른 곳에서 작업 중이고 작업 중인 디렉터리 위에 다른 디렉터리가 있는 경우 복사되지만 작업 중인 디렉터리 위의 디렉터리 bar/x와 동일한 디렉터리는 아닙니다. 안에. 시스템의 어느 곳에서나 작동하도록 하는 유일한 방법은 절대 경로를 사용하는 것입니다.bar/xroot_directory/scripts

cp -r /path/to/root_directory/bar/x /path/to/root_directory

답변3

어떤 이유로 전체 경로를 원하지 않거나 필요하지 않은 경우 다음을 제안합니다.

dir=$(cd $(dirname "$0"); pwd -P)
cd $dir
cd ..
root=$PWD
cd bar
bar=$PWD
cp -r $bar/x $root

현재 스크립트의 전체 경로를 가져옵니다.

dir=$(cd $(dirname "$0"); pwd -P)

Go dir한 다음 뒤로 물러서서 "루트" 디렉터리에 있는 변수에 할당합니다.

cd $dir
cd ..
root=$PWD

bar변수에 할당한 다음 해당 변수를 사용하는 명령을 사용해야 합니다 cp.

cd bar
bar=$PWD
cp -r $bar/x $root

관련 정보