私がシンボリックリンクを設定したとしましょう:
ln -s /root/Public/mytextfile.txt /root/Public/myothertextfile.txt
myothertextfile.txt
のターゲットがコマンドラインを使用しているかどうかを確認する方法はありますか?
使用 -f
フラグを使用して、正規化されたバージョンを出力します。例えば:
readlink -f /root/Public/myothertextfile.txt
man readlink
:
-f, --canonicalize
canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist
readlinkは必要なコマンドです。コマンドのマニュアルページを確認する必要があります。実際のファイルへの一連のシンボリックリンクをたどる場合は、-eまたは-fスイッチが必要です。
$ ln -s foooooo zipzip # fooooo doesn't actually exist
$ ln -s zipzip zapzap
$ # Follows it, but doesn't let you know the file doesn't actually exist
$ readlink -f zapzap
/home/kbrandt/scrap/foooooo
$ # Follows it, but file not there
$ readlink -e zapzap
$ # Follows it, but just to the next symlink
$ readlink zapzap
zipzip
これも機能します:
ls -l /root/Public/myothertextfile.txt
ただし、readlink
は、ls
を解析するのではなく、スクリプトで使用することをお勧めします。
リンクのソースとリンク先を表示する場合は、stat -c%N files*
を試してください。例えば。
$ stat -c%N /dev/fd/*
‘/dev/fd/0’ -> ‘/dev/pts/4’
‘/dev/fd/1’ -> ‘/dev/pts/4’
解析には適していません(そのためにはreadlink
を使用してください)が、ls -l
の混乱なくリンク名とリンク先が表示されます
-c
と記述できます--format
および%N
は、「シンボリックリンクの場合、逆参照付きの引用符で囲まれたファイル名」を意味します。
readlink
は良いことですが、GNU固有でクロスプラットフォームではありません。以前は/bin/sh
のクロスプラットフォームスクリプトを作成していたため、次のようなものを使用します。
ls -l /root/Public/myothertextfile.txt | awk '{print $NF}'
または:
ls -l /root/Public/myothertextfile.txt | awk -F"-> " '{print $2}'
ただし、これらは異なるプラットフォームでテストする必要があります。私はそれらはうまくいくと思いますが、ls
出力フォーマットについて100%確信が持てません。
ls
の結果は、bash
、awk
、sed
などの外部コマンドに依存することなく、Perl
内で解析することもできます。
このbash_realpath
関数は、リンクの最終的な宛先を解決します(リンク→リンク→リンク→最終):
bash_realpath() {
# print the resolved path
# @params
# 1: the path to resolve
# @return
# >&1: the resolved link path
local path="${1}"
while [[ -L ${path} && "$(ls -l "${path}")" =~ -\>\ (.*) ]]
do
path="${BASH_REMATCH[1]}"
done
echo "${path}"
}
質問は、ブライアンブラジルの質問のように単純な答えを出すには十分正確ではありません。
readlink -f some_path
確かに逆参照になりますすべてのシンボリックリンクsome_path
の後ろの最終ターゲットへのパス構成で。
ただし、カスケードシンボリックリンクの1つのレベルは、システム内の特定のケースにすぎず、一般的なケースはNレベルのカスケードシンボリックリンクです。私のシステムで以下を見てください:
$ rwhich emacs
/usr/bin/emacs
/etc/alternatives/emacs
/usr/bin/emacs24-x
rwhich
は、which
の私自身の再帰的な実装であり、中間ターゲットのすべてのカスケードシンボリックリンク(stderrへ)を最終ターゲット(stdoutへ)に出力します。
次に、私が何であるかを知りたい場合:
symlinkのターゲット/usr/bin/emacs **、私への明白な答えは/etc/alternatives/emacs
です。
readlink $(which emacs)
readlink /usr/bin/emacs
thefinalカスケードシンボリックリンクの背後にあるターゲット/usr/bin/emacs、答えは/usr/bin/emacs24-x
になります:
readlink -f $(which emacs)
readlink -f /usr/bin/emacs
rwhich emacs 2>/dev/null
readlink
を使用できない場合、ls -l
の結果の解析は次のように行うことができます。
通常の結果は次のようになります。
ls -l /root/Public/myothertextfile.txt
lrwxrwxrwx 1 root root 30 Jan 1 12:00 /root/Public/myothertextfile.txt -> /root/Public/mytextfile.txt
そのため、「->」の前にあるすべてのものと、含まれている矢印を置き換えます。これにはsed
を使用できます。
ls -l /root/Public/myothertextfile.txt | sed 's/^.* -> //'
/root/Public/mytextfile.txt
ll
またはls -l
は、シンボリックリンクとそのターゲットを含むディレクトリ項目をリストする必要があります
cd -P /root/Public/myothertextfile.txt
(あなたの場合)は元のパスを指す必要があります
フォルダーとそのサブフォルダー内のすべてのリンクのターゲットが見つかった場合は、find . -type l -ls
コマンドとリンクタイプは次のとおりです。
[email protected]:~/test$ find . -type l -ls
8601855888 0 lrwxr-xr-x 1 me staff 6 Jan 24 19:53 ./link -> target
シングルのターゲットが必要な場合は、ls -l
は動作するはずです:
[email protected]:~/test$ ls -l
total 0
lrwxr-xr-x 1 me staff 6 Jan 24 19:53 link -> target
-rw-r--r-- 1 me staff 0 Jan 24 19:53 target