以下を使用して、リンクが指す宛先ファイルを表示できます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つ目は先行スペースを出力できます。