나는 다음과 같은 구조를 가지고 있습니다 :
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
사용해도 상관하지 않지만 -r
BSD 매뉴얼 페이지에는 권장되지 않는 것으로 나열되어 있으므로 다음을 사용하는 것이 더 좋습니다.-R
-r
-R
유틸리티의 기록 버전에 대한 옵션이
cp
있습니다-r
. 이 구현은 이 옵션을 지원하지만 특수 파일, 기호 링크 또는 FIFO를 올바르게 복사하지 않으므로 사용하지 않는 것이 좋습니다.
답변2
명령은 bar/x
표시된 대로 작업 디렉터리 위에 있는 디렉터리의 내용을 복사하도록 지시합니다 ../bar/x
. 해당 디렉토리에 없으면 그 위에 있지 않으므로 scripts
작동하지 않습니다 . bar/x
시스템의 다른 곳에서 작업 중이고 작업 중인 디렉터리 위에 다른 디렉터리가 있는 경우 복사되지만 작업 중인 디렉터리 위의 디렉터리 bar/x
와 동일한 디렉터리는 아닙니다. 안에. 시스템의 어느 곳에서나 작동하도록 하는 유일한 방법은 절대 경로를 사용하는 것입니다.bar/x
root_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