将目录内容复制到根目录,不带相对路径

将目录内容复制到根目录,不带相对路径

我有以下结构:

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

相关内容