![Unixでは、相対パスを使用して/etc/passwdをホームディレクトリの下のディレクトリにコピーする方法は? [閉鎖]](https://linux33.com/image/126740/Unix%E3%81%A7%E3%81%AF%E3%80%81%E7%9B%B8%E5%AF%BE%E3%83%91%E3%82%B9%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%2Fetc%2Fpasswd%E3%82%92%E3%83%9B%E3%83%BC%E3%83%A0%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AE%E4%B8%8B%E3%81%AE%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AB%E3%82%B3%E3%83%94%E3%83%BC%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%EF%BC%9F%20%5B%E9%96%89%E9%8E%96%5D.png)
/etc/passwd
すでに作成したディレクトリに新しい名前でコピーする必要がありますmy_passwd
。絶対パスを使用してコピーする方法を理解しますcp /etc/passwd /home/user/work/my_passwd
。
だから私はこれが.
シェル..
の私のディレクトリで一歩上に移動し、それを入力する場所であることを知っていますcd work
。家にいればそこに行けますか?私は間違っていますか?相対パスを使用してどのようにコピーしますか?
答え1
相対パスはで始まらないパスです/
。
この特定の例では、/etc/passwd
コピーするファイルの絶対パスがわかっている場合は絶対パスです。相対パスに変換することは(通常)実際の目的はありません。(実際、パスは現在のディレクトリツリーのどこにあるかによって異なりますので、状況は混乱する可能性があります。)
ファイルをコピーするディレクトリのファイル名$HOME/work
はですmy_passwd
。 $HOME
ホームディレクトリの絶対パスに展開されます。
絶対パスのみを使用してファイルをコピーします。
cp /etc/passwd "$HOME/work/my_passwd"
これは、現在のファイルシステムのどこにあるかに依存しません(良いです)。
ファイルの相対パスを見つけるには、Linuxでこのコマンドを使用/etc/passwd
できますrealpath
(このユーティリティは他の種類のUnixシステムでは使用できませんが、少なくともUbuntuでは使用できます)。現在のホームディレクトリにあるとします(cd
引数なしでコマンドを発行した後):
$ realpath --relative-to=. /etc/passwd
../../etc/passwd
/etc/passwd
これは「ここで2つのディレクトリを見つけて、次の場所にあります」と言いますetc
。
相対パスを使用してホームディレクトリにあるファイルをコピーする(ディレクトリツリーの他の場所からコピーすることはできません):
$ cp ../../etc/passwd work/my_passwd
work/my_passwd
デフォルトディレクトリからサブディレクトリのファイルまでのmy_passwd
相対パスwork
。
エーテルの組み合わせ
$ cp /etc/passwd work/my_passwd
または
$ cp ../../etc/passwd "$HOME/work/my_passwd"
これは、絶対パスまたは相対パスを指定したいかどうかに応じて、ホームディレクトリでも明らかに機能します。
答え2
相対パスを作成するには/etc/passwd
?相対パスを作成して/
追加しますetc/passwd
。相対パスを作成するには/
?現在のディレクトリの深さを計算し、ルートに向かってそれだけのステップを進めます。
したがって、私たちがにいる場合は、/home/user/work
ルートに向かって移動を3回使用します../../../
。プログラムで現在のパスのスラッシュ数を数えるか、すべてのディレクトリ名を次に変更して最初のスラッシュを最後..
に移動します。
Bashで後者を実行しましょう。
shopt -s extglob
p=${PWD//+([^\/])/..}
p=${p#/}/
echo "current is: $PWD"
echo "path to /: $p"
出力例:
current is: /tmp/x
path to /: ../../
/foo/bar/some/path
おそらくより実用的なケースは、fromからの相対パスが必要であるということです/foo/bar/otherpath
。この場合、共通のプレフィックスを削除して上記の解決策を適用するだけです。