相対パスなしでディレクトリの内容をルートディレクトリにコピーします。

相対パスなしでディレクトリの内容をルートディレクトリにコピーします。

私は次の構造を持っています:

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

コピーするmy_script内容は、bar/xroot_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

関連情報