1. 概要

このチュートリアルでは、シンボリックリンクを通常のファイルに変換するためのさまざまな方法について説明します。 これは、シンボリックリンクを作成した元のソースを削除する場合に役立ちます。

2. シンボリックリンクとは何ですか?

Linuxのシンボリックリンクを使用すると、単一のファイルまたはディレクトリを複数の場所にリンクできます。 つまり、シンボリックリンクを作成したさまざまな場所から単一のファイルまたはディレクトリにアクセスできるようになります。

例としてLinuxディストリビューションを取り上げましょう。 多くのディストリビューションは、ディレクトリ / usr /binおよび/usr /libをそれぞれ/binおよび/lib、にシンボリックリンクし、プログラムが / bin で始まるパスを使用して、 / usr /bin内のファイルにアクセスします。

ln コマンドを使用して、シンボリックリンクを作成します。

$ echo "Hello" > original_file
$ ln -s original_file link_to_file
$ ls -l
total 4
-rw-r--r--    1 baeldung baeldung         6 Jan 21 16:29 original_file
lrwxrwxrwx    1 baeldung baeldung        13 Jan 21 16:29 link_to_file -> original_file
$ sha256sum original_file 
66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18  original_file
$ sha256sum link_to_file # Points to 'original_file'
66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18  link_to_file

シンボリックリンクは、lsコマンド出力の->記号で示されます。

3. ファイルシンボリックリンクをファイルに変換する

シンボリックリンクを通常のファイルに変換するには、さまざまな方法を使用できます。 主なアイデアは、シンボリックリンクを削除し、元のファイルを同じ宛先にコピーすることです。

3.1. realpathおよびcpコマンド

realpath コマンドを使用して、元のファイルへの絶対パスを取得できます。 次に、このパスを cp-fフラグとともに使用して、パスをコピーし、シンボリックリンクを上書きできます。

$ ls -l
total 4
-rw-r--r--    1 baeldung baeldung         6 Jan 21 16:45 original_file
lrwxrwxrwx    1 baeldung baeldung        13 Jan 21 16:39 link_to_file -> original_file
$ cp -f "$(realpath link_to_file)" link_to_file 
$ ls -l
total 8
-rw-r--r--    1 baeldung baeldung         6 Jan 21 16:45 original_file
-rw-r--r--    1 baeldung baeldung         6 Jan 21 16:46 link_to_file
$ cat link_to_file 
Hello

ご覧のとおり、 link_to_file は通常のファイルに変換されており、lsには->の記号が表示されなくなりました。 cp は、ファイルの元のアクセス許可も保持します。

3.2. sedコマンド

sed コマンドは通常、テキストファイルの編集に使用されますが、ファイルのコピーにも使用できます。

$ ls -l
total 4
-rw-r--r--    1 baeldung baeldung         6 Jan 21 16:45 original_file
lrwxrwxrwx    1 baeldung baeldung        13 Jan 21 17:09 link_to_file -> original_file
$ sed -i ';' link_to_file
$ ls -l
total 8
-rw-r--r--    1 baeldung baeldung         6 Jan 21 16:45 original_file
-rw-r--r--    1 baeldung baeldung         6 Jan 21 17:10 link_to_file

-i フラグを使用すると、sedはファイルをインプレースで書き換えますが、セミコロンは操作を実行しないことを表します。

sedはファイルの元の内容のみをコピーし、権限や所有権はコピーしないことに注意してください。

4. ディレクトリシンボリックリンクをディレクトリに変換する

ディレクトリへのシンボリックリンクを作成することもできますが、ディレクトリのシンボリックリンクを通常のディレクトリに変換するプロセスはファイルとは少し異なります。

このために、 rm コマンドを使用してシンボリックリンクを削除し、cpコマンドを使用して元のディレクトリをコピーできます。

$ ls dir/
original_file
$ ls -l
total 0
drwxr-xr-x    2 baeldung baeldung        60 Jan 21 17:16 dir
lrwxrwxrwx    1 baeldung baeldung         3 Jan 21 17:15 link_to_dir -> dir
$ real_dir="$(realpath link_to_dir)" # Store original path
$ rm link_to_dir
$ cp -LR "$real_dir" link_to_dir
$ ls -l
total 0
drwxr-xr-x    2 baeldung baeldung        60 Jan 21 17:16 dir
drwxr-xr-x    2 baeldung baeldung        60 Jan 21 17:19 link_to_dir
$ ls link_to_dir/
original_file

ここで、link_to_dirdirディレクトリへのシンボリックリンクでした。 最初に元のディレクトリへのパスを変数に保存し、次にシンボリックリンクを削除して、その場所の元のディレクトリにコピーします。 最後に、-Lおよび-Rフラグをcpに渡して、すべてのシンボリックリンクが解決され、コンテンツが再帰的にコピーされるようにします。

5. 結論

この記事では、 realpath cp sed などのさまざまなコマンドを使用して、シンボリックリンクを通常のファイルまたはディレクトリに変換する方法について学習しました。