ソースファイルと宛先リンクファイルのみを表示するには、「ls」を使用します。

ソースファイルと宛先リンクファイルのみを表示するには、「ls」を使用します。

以下を使用して、リンクが指す宛先ファイルを表示できますls -l

snowch$ ls -l /usr/local/bin/mvn
lrwxr-xr-x  1 snowch  admin  29 12 Dec 08:58 /usr/local/bin/mvn -> ../Cellar/maven/3.2.3/bin/mvn

他のコマンド(awkなど)を介してパイプすることなく、より少ない出力を表示する方法はありますか?たとえば、

snowch$ ls ?? /usr/local/bin/mvn
/usr/local/bin/mvn -> ../Cellar/maven/3.2.3/bin/mvn

私はOS X 10.9.5で3.2.53を実行しています。複数のコマンドの出力は次のとおりです。

snowch$ ls -H /usr/local/bin/mvn
/usr/local/bin/mvn

snowch$ ls -L /usr/local/bin/mvn
/usr/local/bin/mvn

snowch$ file /usr/local/bin/mvn
/usr/local/bin/mvn: POSIX shell script text executable

snowch$ file -b /usr/local/bin/mvn
POSIX shell script text executable

答え1

ls残念ながら、ファイルプロパティを検索して任意の方法で表示するオプションはありません。一部のシステムにはそのための別々のコマンドがあります(たとえば、GNUstatにはGNUにコマンドまたは機能がありますfind)。

ほとんどの最新システムとほとんどのファイルでは、次のように動作します。

$ ln -s '/foo/bar -> baz' the-file
$ LC_ALL=C ls -ldn the-file | sed '
   1s/^\([^[:blank:]]\{1,\}[[:blank:]]\{1,\}\)\{8\}//'
the-file -> /foo/bar -> baz

これは、出力の最初の行からスペースで区切られた最初の8つのフィールドを削除するように機能しますls -l。 gidがシステムに表示されない場合、または多数のリンクがある場合、最初の2つのフィールドが一緒にリンクされていない限り、これは機能します。

GNUの使用stat:

$ LC_ALL=C stat -c '%N' the-file
'the-file' -> '/foo/bar -> baz'

GNUの使用find:

$ find the-file -prune \( -type l -printf '%p -> %l\n' -o -printf '%p\n' \)
the-file -> /foo/bar -> baz

FreeBSD/OS/X 統計の場合:

f=the-file
if [ -L "$f" ]; then
  stat -f "%N -> %Y" -- "$f"
else
  printf '%s\n' "$f"
fi

統計zsh:

zmodload zsh/stat
f=the-file
zstat -LH s -- "$f"
printf '%s\n' ${s[link]:-$f}

多くのシステムには、readlinkリンク先を取得するための特定のコマンドもあります。

f=the-file
if [ -L "$f" ]; then
  printf '%s -> ' "$f"
  readlink -- "$f"
else
  printf '%s\n' "$f"
fi

答え2

fileコマンドを使用してください。

[sreeraj@server ~]$ ls -l mytest
lrwxrwxrwx 1 sreeraj sreeraj 15 Dec 12 09:31 mytest -> /usr/sbin/httpd

[sreeraj@server ~]$ file mytest
mytest: symbolic link to `/usr/sbin/httpd'

または

[sreeraj@server ~]$ file -b mytest
symbolic link to `/usr/sbin/httpd'
[sreeraj@server ~]$

また、マニュアルページを読み、lsオプションが要件を満たしていることを-L確認してください。-H

答え3

ls少なくともGNUはある(もちろんtcsh実装はあります)環境変数を変更し$LS_COLORSて、任意の場所に区切り文字を挿入できます。(ただし、tcsh組み込み関数はls-Fリンク先を実行しません。リンクフラグ)通常、印刷できlsない任意の端末エスケープは、この環境変数に格納されている値に基づいて挿入されますが、他の任意のコンテンツを挿入するのを防ぐことはできません。これについてもっと詳しくここ

たとえば、

LS_COLORS='ln=///\n:lc=:no=//:rc=:rs=:' \
\ls ~ -l --color=always | 
sed '\|///|,\|//|!d;//d'

//これにより、各リストの先頭に文字列が配置されます。(だから直前にlrwcrwx///\nリンクされたファイル名の前に。sed次に、行範囲をフィルタリングします。d入力行が見つかるまですべての入力行を削除し、///そこから一致する次の行まで//一致する行を削除します//。したがって、間の文字に関係なく、リンク名とリンク先のみを取得します。/これは、ファイル名には表示できず、印刷できるパス内のファイル名は個別にのみ表示されるlsためです。

願いより?

mkdir test; cd test
touch 'long


name' shortname
ln -s l* "$(printf %s.ln l*)"; ln -s s* shortname.ln

LS_COLORS='ln=///\n:lc=:no=//:rc=:rs=:' \
\ls  -l --color=always | sed '\|///|,\|//|!d;//d'

...印刷:

long


name.ln -> long


name
shortname.ln -> shortname

自分で試してみてください。

答え4

[Linux/配布]

私はそうします:

ls -l | sed -e"s/ \+/ /g" | cut -d' ' -f 9-

このsedコマンドは、複数のスペースを単一のスペースに縮小し、cutフィールド区切り文字がスペースである9番目のフィールドを抽出します。

一般的な出力:

libboost_atomic.a
libboost_atomic.so -> libboost_atomic.so.1.57.0
libboost_atomic.so.1.57.0
...
libboost_wserialization.a
libboost_wserialization.so -> libboost_wserialization.so.1.57.0
libboost_wserialization.so.1.57.0

選択肢は次のとおりです。

ls -l | awk '{ print $9, $10, $11 }'
ls -l | awk '{ $1 = $2 = $3 = $4 = $5 = $6 = $7 = $8 = "" ; print }'

しかし、これは不完全です。 1つ目は末尾のスペースを出力し、2つ目は先行スペースを出力できます。

関連情報