केवल `ls` का उपयोग करके स्रोत फ़ाइल और लक्षित फ़ाइल को दिखाएँ


11

मैं लक्ष्य फ़ाइल दिखा सकता हूं जो एक लिंक का उपयोग करने के लिए इंगित करता है 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

जवाबों:


7

lsदुर्भाग्य से फ़ाइल विशेषताओं को प्राप्त करने और उन्हें एक अनियंत्रित तरीके से प्रदर्शित करने का विकल्प नहीं है। कुछ सिस्टम के लिए अलग-अलग कमांड होते हैं (उदाहरण के लिए GNU में statकमांड या 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

stat -f "%N -> %Y" -- /usr/local/bin/mvnबढ़िया काम किया। धन्यवाद!
क्रिस स्नो

1
एक पुराने RHEL6 सिस्टम पर, स्टेटस GNU Coreutils 8.4 का है और यह एक है stat -c %N -- /usr/local/bin/mvn। कोटेशन निकालने के लिए मुझे इसे| perl -pe 's/['"'"'`]//g'
cfi

@ सीफी tr -d \'\`काफी होगी। ध्यान दें कि आरएचईएल सिस्टम में जीएनयू होगा findजिसके साथ आपका अधिक नियंत्रण होगा।
स्टीफन चेजलस

5

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और कहा कि अगर आपकी आवश्यकता पर्याप्त होगा देखते हैं।


शांत, हर दिन कुछ नया सीखें।
डकैती

@ श्री - बहुत धन्यवाद! मैंने lsविकल्पों की कोशिश की थी , लेकिन नहीं file। दुर्भाग्य से, न तो काम करने के लिए लगता है :(
क्रिस स्नो

@SHC क्षमा करें, मैंने मान लिया कि आप एक linuxबॉक्स पर हैं। कृपया osxअपने टैग में से एक के रूप में जोड़ें । यह osxउपयोगकर्ताओं के ध्यान में भी जाना चाहिए । मैंने टैग जोड़ने के लिए पोस्ट को संपादित किया है, लेकिन मेरे पास तुरंत संपादन के लिए पर्याप्त क्रेडिट नहीं है।
श्री

@ श्री - कोई चिंता नहीं है, और भ्रम के लिए खेद है। मैंने आपके उत्तर को किसी भी तरह उखाड़ दिया है क्योंकि जब मैं एक लिनक्स मशीन पर वापस आता हूं तो यह उपयोगी होगा।
क्रिस स्नो

शायद ओएक्सएक्स पर 'रीडलिंक' उपयोगिता की जांच करें।
टोनियोक

2

एक जीएनयू के साथ lsकम से कम (और, जाहिरा तौर पर, tcshके कार्यान्वयन) आप हैक कर सकते हैं $LS_COLORSजहां की तरह सीमांकक सम्मिलित करने के लिए वातावरण चर (लेकिन tcshके builtin 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

इसे स्वयं आज़माएं।


क्या आप GNU के आधुनिक संस्करणों के अलावा किसी भी कार्यान्वयन के बारे में जानते हैं जो तर्कों के बाद इस तरह से और विकल्पों lsका समर्थन करता LS_COLORSहै --color=always? यदि एक GNU सिस्टम पर, आप किसी ऐसी चीज़ का उपयोग क्यों करेंगे, जिसे आप उपयोग करते समय findया उसके बाद बदल सकते हैं stat? यदि आप कुछ करते हैं तो वह भी शायद काम नहीं करेगा ln -s /// some-file
स्टीफन चेज़लस

@StephaneChezales - यह कम से कम इंगित करता है कि इसे bsd के साथ इसी तरह काम करना चाहिए ls। मुझे याद है कि कहीं और महीनों पहले lsवाक्यविन्यास जैसे शब्द को स्वीकार करने की प्रवृत्ति के बारे में । बात के बारे में अच्छी ln -s ///बात - लेकिन \0एनयूएल के रूप में अच्छी तरह से काम करते हैं - और -Rपारिस्थितिक रूप से। क्यों - ठीक है, इसका उपयोग करना आसान है। कुछ मामलों में आसान की तुलना में find- और यह विषय पर थोड़ा अधिक लग रहा था find। किसी भी मामले में, बहुत सारे लोग इस पर विचार नहीं करते हैं, इसलिए मैं इसका उल्लेख करता हूं जब मुझे याद दिलाया जाता है।
मोकेसर

देखें आदमी पेज या वहाँ FreeBSD के लिए। यदि आप FreeBSD पर चीजों का परीक्षण करना चाहते हैं, तो आप एक VM में GhostBSD / mfsbsd जैसी लाइव सीडी का उपयोग कर सकते हैं।
स्टीफन चेज़लस

@ स्टीफनचेज़लस - नहीं, मुझे इसकी जांच करने की आवश्यकता नहीं है - निश्चित रूप से पूरी तरह से अलग जानवर । यदि आप गौर करें, तो इस उत्तर में लिंक में ग्नू स्रोत भी जुड़ा हुआ है। मुझे आश्चर्य है कि मैं उस दूसरी चीज़ को कहाँ पढ़ता हूँ? यह इंगित करने के लिए बहुत बहुत धन्यवाद, हालांकि, यह एक गलत धारणा थी जिसे त्यागने की खुशी थी। ive ने उत्तर संपादित किया।
मोकेसर

हाल के संस्करणों में tcshएक ls-Fबिल्डिन है जो LS_COLORSGNU के कुछ संस्करणों के समान ही समर्थन करता है ls, लेकिन ls -Fयदि आप इसके लिए कोई विकल्प पास करते हैं तो यह इनवॉइस करने का समर्थन करता है, ताकि जब तक आपके सिस्टम पर lsGNU नहीं होगा, तब तक यहां काम नहीं करेगा ls
स्टीफन चेज़लस

-1

[लिनक्स / बैश पर]

मैं यह करूँगा:

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

sedआदेश एक जगह करने के लिए कई रिक्त स्थान गिर; cut9-फ़ील्ड को बाद में निकालता है जहाँ फ़ील्ड-विभाजक एक स्थान है।

इससे विशिष्ट उत्पादन:

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

लेकिन वे अपूर्ण हैं: पहला अनुगामी रिक्त स्थान का उत्पादन कर सकता है; दूसरा, अग्रणी स्थान।


प्रश्न स्पष्ट रूप से कहा "... एक और आदेश के माध्यम से पाइप के बिना ..."
जेफ स्कालर

@ जेफ़ शेचलर: अच्छी बात; मैं सहमत हूँ। मुझे उम्मीद है, हालांकि, यह अभी भी किसी को शीर्षक सवाल (विवरण में विस्तार के बिना) के जवाब के लिए उपयोग करना है।
Rhubbarb
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.