yalnızca kaynak dosyayı ve bağlantılı dosyayı yalnızca "ls" kullanarak göster


11

Bir bağlantının işaret ettiği hedef dosyayı gösterebilirim 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 gibi başka bir komuttan geçmeden daha az çıktı göstermenin bir yolu var mı? Örneğin:

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

OS X 10.9.5 üzerinde 3.2.53 çalıştırıyorum. Birkaç komutun çıktısı aşağıda gösterilmiştir:

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

Yanıtlar:


7

lsmaalesef dosya özniteliklerini alma ve bunları keyfi bir şekilde görüntüleme seçeneği yoktur. Bazı sistemler bunun için ayrı komutlara sahiptir (örneğin GNU'nun bir statkomutu veya GNU'daki işlevselliği vardır find).

Çoğu modern sistemde, çoğu dosyayla birlikte, bunun çalışması gerekir:

$ 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

Bu, çıktısının ilk satırındaki ilk 8 boş sınırlandırılmış alanı kaldırarak çalışır ls -l. Bu, gid'in orada görüntülenmediği veya çok sayıda bağlantı olduğunda ilk 2 alanın birleştirildiği sistemler dışında çalışmalıdır.

GNU ile stat:

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

GNU ile find:

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

FreeBSD / OS / X statüyle:

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

İle zshStat:

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

Birçok sistem ayrıca readlinkbir bağlantının hedefini alma komutuna sahiptir:

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

stat -f "%N -> %Y" -- /usr/local/bin/mvnharika çalıştı. Teşekkürler!
Chris Snow

1
Eski bir RHEL6 sisteminde, stat GNU coreutils 8.4'tür ve burada bir stat -c %N -- /usr/local/bin/mvn. | perl -pe 's/['"'"'`]//g'
Alıntıları

@cfi tr -d \'\`yeterli olur. RHEL sisteminin findüzerinde daha fazla kontrole sahip olacağınız GNU olacağını unutmayın .
Stéphane Chazelas

5

fileKomutu kullanın .

[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'

veya

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

Ayrıca, lütfen kılavuz sayfasını okuyup lsseçenekleri kontrol edin -Lve -Hgereksiniminizi karşılayıp karşılamayacağını görün.


her gün yeni bir şeyler öğren.
soymak

@Sree - Çok teşekkürler! lsSeçenekleri denemiştim ama değil file. Ne yazık ki, ikisi de işe yaramıyor :(
Chris Snow

@SHC Üzgünüm, bir linuxkutuda olduğunu varsaydım . Lütfen osxetiketlerinizden biri olarak ekleyin. Bu da osxkullanıcıların dikkatini çekmelidir . Etiketi eklemek için yayını düzenledim, ancak düzenlemenin hemen görünmesi için yeterli kredim yok.
Sree

@Sree - endişelenme ve karışıklık için özür dilerim. Bir linux makineye geri döndüğümde faydalı olacağından cevabınızı zaten iptal ettim.
Chris Snow

belki osx üzerindeki 'readlink' yardımcı programını kontrol edin.
tonioc

2

lsEn az bir GNU ile (ve görünüşe göre, tcshuygulamanın) istediğiniz $LS_COLORSyere sınırlayıcılar eklemek için ortam değişkenini hackleyebilirsiniz (ancak tcshyerleşik ls-Fbağlantı bağlantı hedefleri yapmaz - yalnızca bağlantı bayrakları ) Genellikle lsrastgele yazdırılamayan terminal çıkışları ekler bu ortamda saklanan değerlere dayanarak değişir, ancak bunun yerine keyfi bir şey eklememizi engelleyen hiçbir şey yoktur. Burada daha fazlası .

Örneğin:

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

Bu //, her girişin başına (yani hemen önce lrwcrwx) ve ///\nherhangi bir bağlantının dosya adından hemen önce bir dize koyar . seddaha sonra satır aralıklarında filtreler - dkarşılaşılana kadar her giriş satırını seçer ///ve oradan eşleşen bir sonraki satır boyunca //eşleşen satırları siler //. Böylece, aradaki karakterlerden bağımsız olarak yalnızca bağlantı adını ve bağlantı hedefini alır. Bunun nedeni /bir dosya adında gerçekleşememesidir - ve herhangi bir lsyoldakiler yalnızca tek başına gerçekleşebilir.

Görmek?

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'

... yazdırılan:

long


name.ln -> long


name
shortname.ln -> shortname

Kendin dene.


GNU'nun modern sürümlerinin yanı sıra ls, LS_COLORSbu şekilde ve --color=alwaysargümanlardan sonra ve seçenekleri destekleyen herhangi bir uygulama biliyor musunuz ? GNU sistemindeyseniz, niçin kullanabileceğiniz zaman kıvrık bir şey kullanırsınız findveya stat? Biraz yaparsanız muhtemelen işe yaramaz ln -s /// some-file.
Stéphane Chazelas

@StephaneChezales - bu en azından bir bsd ile benzer şekilde çalışması gerektiğini gösterir ls. Ben aylar önce lssözdizimi gibi bir termcap kabul eğilimi hakkında başka bir yerde okuma hatırlıyorum . ln -s ///Şey hakkında iyi bir nokta - ama \0NUL'ler de işe yarıyor - ve -Rcoşkulu. Neden - iyi, kullanımı kolay. Bazı durumlarda bundan daha kolay find- ve burada konuya göre daha fazla görünüyordu find. Her durumda, çok fazla insan bunu düşünmez, bu yüzden hatırlattığımda bahsediyorum.
mikeserv

FreeBSD için kılavuz sayfasına veya buraya bakınız . FreeBSD'de bir şeyleri test etmek istiyorsanız, bir sanal makinede GhostBSD / mfsbsd gibi canlı CD'ler kullanabilirsiniz.
Stéphane Chazelas

@ StéphaneChazelas - hayır, test etmeme gerek yok - kesinlikle tamamen farklı bir hayvan . Bakmaya özen gösterirseniz, gnu kaynağı da bu cevaptaki bağlantıya bağlanır. başka bir şeyi nerede okuduğumu merak ediyorum? işaret ettiğin için çok teşekkür ederim, bu yanlış bir varsayımdır. cevabı düzenledim.
mikeserv

Son sürümlerinde bazı GNU sürümleriyle aynı şekilde desteklenen tcshbir ls-Fyerleşik vardır , ancak herhangi bir seçeneği geçerseniz çağırmaya başvurur , böylece sisteminizde GNU olmadığı sürece burada çalışmayacaktır . LS_COLORSlsls -Flsls
Stéphane Chazelas

-1

[Linux / Bash'te]

Bunu yapardım:

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

sedKomut tek bir alan için birden çok boşluğu daraltır; cutalan ayırıcısının boşluk olduğu 9. alanı ileri doğru ayıklar.

Bundan tipik çıktı:

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

Alternatifler:

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

Ama bunlar kusurlu: birincisi sondaki boşlukları çıkarabilir; ikincisi, önde gelen boşluklar.


Soru açıkça "... başka bir komuttan geçmeden ..."
Jeff Schaller

@JeffSchaller: İyi bir nokta; Katılıyorum. Umarım, bu hala başlık sorusuna cevap vermek isteyen biri için yararlıdır (açıklamadaki detay olmadan).
Rhubbarb
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.