Bagaimana menemukan semua tautan lunak (tautan simbolik) di direktori saat ini?

10

Pertanyaan terkait dengan skrip shell di bash.

Bagaimana cara memeriksa dengan skrip file mana dalam direktori saat ini yang merupakan tautan lunak?

Jika saya menggunakan istilah yang salah, ketika saya mengatakan tautan lunak , saya merujuk ke file yang dibuat menggunakan ln -s.

Satu-satunya hal yang berhasil saya pikirkan adalah mengevaluasi ls -lasebagai ekspresi, dan menguraikan hasilnya, tetapi jelas ini bukan solusi terbaik.

bguiz
sumber
1
Mereka disebut sebagai "tautan simbolik" (sebagai lawan dari "tautan keras").
Dijeda sampai pemberitahuan lebih lanjut.
Righto, saya tahu saya mungkin salah istilah, terima kasih untuk kepala
bguiz
Tautan lunak juga baik-baik saja, tetapi dengan spasi. :-) ( en.wikipedia.org/wiki/Symbolic_link )
Arjan

Jawaban:

14

Lihat 'EKSPRESI KONDISI' dalam man bash- dalam hal ini Anda ingin -h:

for file in *
do
  if [ -h "$file" ]; then
    echo "$file"
  fi
done
Polsy
sumber
2
faqs.org/docs/bashman/bashref_68.html - Untuk ekspresi kondisional membuat bacaan lebih baik daripada halaman manual.
Manos Dilaverakis
Terima kasih @Polsy dan @Manos! test -hadalah apa yang saya inginkan!
bguiz
14

Anda mungkin tidak benar-benar membutuhkan skrip. Untuk menampilkan tautan simbolik apa saja di folder saat ini, tanpa berulang ke folder anak apa pun:

Temukan . -maxdepth 1 -type l -print

Atau, untuk mendapatkan info lebih lanjut, gunakan salah satu dari:

Temukan . -maxdepth 1 -type l -exec ls -ld {} +
Temukan . -maxdepth 1 -type l -print0 | xargs -0 ls -ld

Untuk mengetahui apakah suatu file adalah tautan simbolik, seseorang dapat menggunakan readlink, yang tidak akan menghasilkan apa-apa jika itu bukan tautan simbolik. Contoh berikut tidak cukup berguna, tetapi menunjukkan bagaimana readlinkmengabaikan file dan folder normal. Gunakan salah satu dari:

Temukan . -maxdepth 1 -exec readlink {} +
Temukan . -maxdepth 1 -print0 | xargs -0 readlink

Perhatikan bahwa di atas -exec ... +dan xargs ...jauh lebih cepat daripada -exec ... \;. Suka:

waktu temukan / usr / bin -maxdepth 1 -type l -exec ls -ld {} \;
0m0.372s nyata
pengguna 0m0.087s
sys 0m0.163s

waktu temukan / usr / bin -maxdepth 1 -type l -exec ls -ld {} +
0m0.013s nyata
pengguna 0m0.004s
sys 0m0.008s

waktu temukan / usr / bin -maxdepth 1 -type l -print0 | xargs -0 ls -ld
0m0.012s nyata
pengguna 0m0.004s
sys 0m0.009s
Arjan
sumber
Saya lebih suka jawaban Polsy, masih +1 untuk Anda, karena saya mungkin perlu melakukannya di luar skrip shell suatu hari.
bguiz
1
Anda tidak perlu xargs. Anda bisa menggunakan find. -maxdepth 1 -exec readlink {} \;
stib
Benar, @stib, tetapi xargsadalah banyak lebih cepat pada Mac saya; lihat hasil edit saya. Tapi saya belajar sesuatu yang baru hari ini: ada juga +alih-alih \;(Meskipun beberapa orang mengklaim bahwa ini memiliki / memiliki masalah dengan grep).
Arjan