Bagaimana cara membuat tautan simbolis ke semua file (kelas file) dalam direktori?

43

Saya ingin membuat tautan simbolik ( ln -s) ke semua file (atau kelas file, misalnya diakhiri dengan .bar) di direktori tertentu. Katakanlah saya di cwd dan ketik ls ../source/*.barmemberi saya

foo.bar
baz.bar

bagaimana saya bisa melewati daftar parameter ln -syang akhirnya diputuskan untuk

ln -s ../source/foo.bar
ln -s ../source/baz.bar

Tentu saja saya tahu saya bisa menulis skrip bash, tetapi harus ada sesuatu yang lebih sederhana karena melibatkan xargstugas yang umum - setidaknya untuk saya.

dastrobu
sumber

Jawaban:

75

ln memang mengambil beberapa argumen, tetapi jangan lupa untuk memberikan direktori target dalam kasus itu.

Jadi, dalam contoh Anda .adalah direktori target, jadi semudah itu

ln -s ../source/*.bar .

Dari man ln; perintah di atas menggunakan formulir ke-3:

ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
ln [OPTION]... TARGET                  (2nd form)
ln [OPTION]... TARGET... DIRECTORY     (3rd form)
ln [OPTION]... -t DIRECTORY TARGET...  (4th form)
  • Di formulir 1, buat tautan ke TARGET dengan nama LINK_NAME.
  • Di formulir ke-2, buat tautan ke TARGET di direktori saat ini.
  • Di formulir 3 dan 4, buat tautan ke setiap TARGET di DIRECTORY.
mpy
sumber
5
Anda baru saja menyelamatkan saya 5 menit solid dalam hidup saya, cukup layak untuk menghabiskan salah satu dari mereka meninggalkan komentar. :-)
moodboom
Ini tidak berfungsi jika tidak ada file *.bar. Ini akan membuat tautan dengan nama "*.bar", yang bukan yang Anda inginkan.
Nimrod
1
@Nimrod: Itu benar, tetapi Anda dapat memberi tahu bash bahwa Anda ingin melaporkan kesalahan melalui shopt -s failglob; lihat misalnya unix.stackexchange.com/a/216227/33390 (Setara dalam zsh adalah setopt nomatch, yang dihidupkan secara default)
mpy
: bertepuk tangan: bagus!
Chris Schmitz
3

Menggunakan find

certainDir="/path/to/dir"
find -name "*.bar" -exec ln -s {} "$certainDir" \;

Juga, ingatlah untuk menggunakan jalur lengkap (jika mungkin) dengan symlink.

hanya browsing
sumber
2
Terima kasih, tapi bukan find $certainDir -name "*.bar" -exec ln -s {} \;? Dan mengapa saya harus menggunakan jalur penuh? Saya merasa cukup nyaman untuk mengetahui bahwa tautan tetap utuh ketika saya memindahkan pohon direktori di sekitar yang memiliki beberapa tautan internal.
dastrobu
Itu tergantung di mana Anda ingin symlink direktori. Dan saya tidak ingat mengapa jalan penuh adalah ide yang bagus, mungkin karena hubungan yang sulit tetapi saya membakarnya ke dalam pikiran saya karena suatu alasan. Hmmm.
justbrowsing
Terima kasih, jawaban Anda bagus. Karena jawaban mpy adalah solusi yang lebih sederhana untuk pertanyaan tersebut, intinya menjadi miliknya. Saya akan menerima kedua jawaban, jika saya bisa.
dastrobu
3

Anda dapat mencoba secara rekursif dengan menggunakan globstar (bash / zsh ditetapkan oleh:) shopt -s globstar:

ls -vs ../**/*.bar .

Catatan: Ditambahkan -vuntuk verbose.

Atau jika daftar terlalu panjang, gunakan findutilitas:

find .. -name \*.bar -exec ln -vs "{}" dest/ ';'

Ini akan membuat tautan dest/, atau mengubahnya ke .untuk folder saat ini.

kenorb
sumber
Yang kedua adalah jawaban yang benar.
Nimrod
0

cpdengan -sopsi dapat membuat tautan lunak (atau -luntuk tautan keras).

Dari direktori saat ini dapat dengan digunakan seperti ini:

$ cp -s ../path/with/scripts/* .

Dalam kasus Anda, akan seperti ini:

$ cp -s ../source/*.bar .
cy8g3n
sumber