Daftar symlink di direktori saat ini?

8

Pertanyaan ini berbicara tentang menemukan direktori dalam direktori saat ini. Solusinya pada dasarnya:

ls -d */

Itu hebat, tetapi bagaimana saya bisa dengan mudah mendaftar symlink? Apakah saya harus menggunakan sesuatu seperti

find . -xtype l -d 1
(intended to find symlinks max depth 1 - doesn't work)

Atau ada cara yang lebih mudah? Bisakah l digunakan untuk ini?

cwd
sumber
Pada sistem Ubuntu saya, lihat sekilas pada man findacara yang -dmerupakan sinonim untuk -depth(untuk kompatibilitas dengan FreeBSD, NetBSD, MacOS X dan OpenBSD.), Yaitu. tidak sama dengan -maxdepth. . . -depth Proses isi setiap direktori sebelum direktori itu sendiri
Peter.O

Jawaban:

9

Di zsh (tambahkan Ndi dalam tanda kurung untuk menyertakan symlink yang namanya dimulai dengan a .):

echo *(@)

Dengan sebagian besar findimplementasi:

find -maxdepth 1 -type l

Sesuai dengan POSIX:

find . -type d \! -name . -prune -o -type l -print

Atau dengan lingkaran shell:

for x in * .*; do
  if [ -h "$x" ]; then echo "$x"; done
done
Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Untuk -pruneopsi, Anda harus menggunakan find topdir ! -name topdir -prune; jika tidak, direktori awal juga akan diabaikan.
Arcege
6

Ini bukan pada Mac, tapi

find . -maxdepth 1 -type l

bekerja untukku.

frogstarr78
sumber
3

Anda harus menggunakan -typedan tidak -xtype:

   -xtype c
          The same as -type unless the file is a symbolic link.  For  sym‐
          bolic  links:  if the -H or -P option was specified, true if the
          file is a link to a file of type c; if the -L  option  has  been
          given,  true  if  c is `l'.  In other words, for symbolic links,
          -xtype checks the type of the file that -type does not check.

Standarnya adalah -P, jadi opsi -xtype akan mencoba menentukan file yang dihasilkan, bukan symlink itu sendiri. Sebenarnya, saya mendapatkan beberapa hasil positif, yang sepertinya seperti bug. The -P -xtype lharus kembali benar (di symlink) IFF resultan itu sendiri merupakan link simbolik.

Bisa juga menggunakan: ls -FA | sed -ne 's/@//p'yang hanya akan menampilkan symlink.

Arcege
sumber
solusi ls bagus
frogstarr78
2
sed -ne 's/@//p'(dan bahkan sed -ne 's/@$//p') bukan tes aman, karena versi pertama akan memberikan false positive ketika @terjadi di mana saja dalam output ls , dan yang kedua akan mengembalikan postive palsu ketika nama file benar-benar berakhir@
Peter.O
1

Untuk mengetahui hanya file yang merupakan symlink di dalam direktori saat ini:

find . -type l -printf '%p -> %l\n'

Ini akan secara rekursif mendaftar semua file symlink. Juga, ini menunjukkan file aktual yang ditunjuknya.

periwinkle1
sumber