我有以下结构:
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"/..
GNUcp
不关心是否使用-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)
转到dir
,然后后退一步,您在“root”目录中,分配给一个变量:
cd $dir
cd ..
root=$PWD
必须bar
将其分配给变量,然后使用cp
使用变量的命令
cd bar
bar=$PWD
cp -r $bar/x $root