私は次の構造を持っています:
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