Zeigen Sie nur die Quelldatei und die verknüpfte Zieldatei mit `ls` an

11

Ich kann die Zieldatei anzeigen, auf die ein Link verweist 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

Gibt es eine Möglichkeit, weniger Ausgabe anzuzeigen, ohne einen anderen Befehl wie awk durchlaufen zu müssen? Z.B:

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

Ich verwende 3.2.53 unter OS X 10.9.5. Die Ausgabe mehrerer Befehle ist unten dargestellt:

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
Chris Snow
quelle

Antworten:

7

lsLeider gibt es keine Möglichkeit, Dateiattribute abzurufen und auf beliebige Weise anzuzeigen. Einige Systeme haben dafür separate Befehle (zum Beispiel hat GNU einen statBefehl oder die Funktionalität in GNU find).

Auf den meisten modernen Systemen mit den meisten Dateien sollte dies jedoch funktionieren:

$ 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

Dies funktioniert, indem die ersten 8 durch Leerzeichen getrennten Felder der ersten Zeile der Ausgabe von entfernt werden ls -l. Dies sollte funktionieren, außer auf Systemen, auf denen die GID dort nicht angezeigt wird oder die ersten beiden Felder zusammengefügt werden, wenn eine große Anzahl von Links vorhanden ist.

Mit GNU stat:

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

Mit GNU find:

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

Mit FreeBSD / OS / X stat:

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

Mit zshstat:

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

Viele Systeme haben auch einen readlinkBefehl, um das Ziel einer Verbindung gezielt zu ermitteln:

f=the-file
if [ -L "$f" ]; then
  printf '%s -> ' "$f"
  readlink -- "$f"
else
  printf '%s\n' "$f"
fi
Stéphane Chazelas
quelle
stat -f "%N -> %Y" -- /usr/local/bin/mvnhat super funktioniert. Vielen Dank!
Chris Snow
1
Auf einem alten RHEL6-System ist stat von GNU Coreutils 8.4 und dort ist es ein stat -c %N -- /usr/local/bin/mvn. So entfernen Sie die Zitate ich Rohr hatte dieser in| perl -pe 's/['"'"'`]//g'
cfi
@ CFI tr -d \'\`wäre genug. Beachten Sie, dass dieses RHEL-System über eine GNU verfügt, findüber die Sie mehr Kontrolle haben.
Stéphane Chazelas
5

Verwenden Sie den fileBefehl.

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

oder

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

Lesen Sie auch die Manpage von lsund überprüfen Sie die Optionen -Lund prüfen -HSie, ob dies für Ihre Anforderungen ausreicht.

Sree
quelle
cool, lerne jeden Tag etwas Neues.
Rob
@Sree - Vielen Dank! Ich hatte die lsOptionen ausprobiert , aber nicht file. Leider scheint beides nicht zu funktionieren :(
Chris Snow
@SHC Sorry, ich habe angenommen, dass du auf einer linuxBox bist . Bitte fügen Sie osxals eines Ihrer Tags. Das sollte auch die osxBenutzer auf sich aufmerksam machen. Ich habe den Beitrag bearbeitet, um das Tag hinzuzufügen, aber ich habe nicht genügend Credits, damit die Bearbeitung sofort angezeigt wird.
Sree
@Sree - keine Sorge, und entschuldigen Sie die Verwirrung. Ich habe Ihre Antwort trotzdem positiv bewertet, da sie nützlich sein wird, wenn ich wieder auf einem Linux-Computer bin.
Chris Snow
Vielleicht überprüfen Sie das Dienstprogramm 'readlink' auf osx.
Tonioc
2

lsZumindest mit einer GNU (und anscheinend mit tcshder Implementierung) können Sie die $LS_COLORSUmgebungsvariable hacken , um Trennzeichen einzufügen, wo Sie möchten (aber tcshdie integrierte Funktion ls-Fführt keine Verknüpfungsziele aus - nur Verknüpfungsflags ). Fügt normalerweise lsbeliebige nicht druckbare Terminal-Escapezeichen ein basierend auf den in dieser Umgebung gespeicherten Werten var, aber nichts hindert uns daran, stattdessen willkürlich etwas anderes einzufügen. Mehr dazu hier .

Beispielsweise:

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

Dadurch wird eine Zeichenfolge wie //am Anfang jeder Auflistung (also kurz zuvor lrwcrwx) und ///\nkurz vor dem Dateinamen eines Links eingefügt. sedfiltert dann nach Zeilenbereichen - es wird djede Eingabezeile gelöscht, bis sie auf sie trifft, ///und von dort durch die nächste Zeile, die übereinstimmt //, werden übereinstimmende Zeilen gelöscht //. Es werden also nur der Linkname und das Linkziel abgerufen - unabhängig von den dazwischenliegenden Zeichen. Dies liegt daran, /dass ein Dateiname nicht vorkommen kann - und diejenigen in einem Pfad, die lsmöglicherweise gedruckt werden, nur einzeln auftreten.

Sehen?

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'

... welche druckt:

long


name.ln -> long


name
shortname.ln -> shortname

Versuch es selber.

mikeserv
quelle
Kennen Sie eine Implementierung außer modernen Versionen von GNU ls, die LS_COLORSdiesen Weg unterstützt , und a --color=alwaysund Optionen nach Argumenten? Wenn auf einem GNU-System, warum sollten Sie etwas verwenden, das sich verschlungen hat, wenn Sie es verwenden können findoder stat? Das wird wahrscheinlich auch nicht funktionieren, wenn Sie welche tun ln -s /// some-file.
Stéphane Chazelas
@StephaneChezales - dies zeigt zumindest an, dass es mit einem bsd ähnlich funktionieren sollte ls. Ich erinnere mich, dass ich vor Monaten irgendwo anders gelesen habe, dass lsalle dazu neigen, eine Termcap-ähnliche Syntax zu akzeptieren. Guter Punkt über die ln -s ///Sache - aber \0NULs funktionieren auch - und -Rekursiv. Warum - nun, es ist einfach zu bedienen. In einigen Fällen einfacher als find- und es schien hier ein wenig mehr zum Thema zu gehören als findes gewesen wäre. Auf jeden Fall denken nicht zu viele Leute darüber nach, deshalb erwähne ich es, wenn ich daran erinnert werde.
Mikeserv
Siehe die Manpage oder dort für FreeBSD. Wenn Sie Dinge auf FreeBSD testen möchten, können Sie Live-CDs wie GhostBSD / mfsbsd in einer VM verwenden.
Stéphane Chazelas
@ StéphaneChazelas - nein, ich muss es nicht testen - definitiv ein ganz anderes Tier . Wenn Sie nachsehen möchten, ist die Gnu-Quelle auch im Link in dieser Antwort verlinkt. Ich frage mich, wo ich das andere Ding gelesen habe. Vielen Dank für den Hinweis, dass dies eine falsche Annahme war, die ich gerne verwerfe. Ich habe die Antwort bearbeitet.
Mikeserv
Neuere Versionen von tcshverfügen über eine integrierte ls-FVersion, die LS_COLORSdie gleiche Version wie einige Versionen von GNU unterstützt. Sie lswird jedoch aufgerufen, ls -Fwenn Sie eine Option an GNU übergeben. Dies funktioniert hier nur, wenn lsGNU lsauf Ihrem System vorhanden ist.
Stéphane Chazelas
-1

[Unter Linux / Bash]

Ich würde das tun:

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

Der sedBefehl reduziert mehrere Leerzeichen zu einem einzigen Leerzeichen. Das cutextrahiert das 9. Feld weiter, wobei das Feldtrennzeichen ein Leerzeichen ist.

Typische Ausgabe davon:

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

Alternativen sind:

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

Aber diese sind unvollkommen: Der erste kann nachgestellte Leerzeichen ausgeben; die zweiten führenden Räume.

Rhubbarb
quelle
Die Frage lautete ausdrücklich "... ohne einen anderen Befehl durchlaufen zu müssen ..."
Jeff Schaller
@ JeffSchaller: Guter Punkt; Genau. Ich hoffe jedoch, dass dies für jemanden von Nutzen ist, der eine Antwort auf die Titelfrage wünscht (ohne die Details in der Beschreibung).
Rhubbarb