Quick Symlink - a Finder extension which provides a contextual menu item for the symbolic links creation on macOS

Last update: May 19, 2022

Quick Symlink

The Quick Symlink is a Finder extension which provides a contextual menu item for the symbolic links (and other links) creation on macOS.

tag release

osslifecycle last_commit release_date

licence Contributor Covenant FOSSA Status

repo_size languages_code_size languages_count languages_top

platform

📇 Table of Contents

📖 About

The Quick Symlink is a Finder Extension which allows to create symbolic links of selected folders or files. It could be called by right-clicking on selected folders or files and selecting Quick Symlink from the contextual menu. It is a remaster of the other project - create-symlink; for more details see https://github.com/ololx/create-symlink.

Motivation

For me the symbolic links is a useful feature of macOS. They can be especially useful when it's needed to store the Documents folder on a hard drive or SD card, but on the ssd to create a just link to this folder. Of course, creating symbolic links via the terminal is very easy and convenient. But this does not negate the fact that it could be even easier and more comfortable through interaction with the GUI.

📸 Demo

This GIF demonstrates how the Quick Symlink allows quite simple to select files or folders and paste symlink in the current directory.

This GIF demonstrates how the Quick Symlink allows quite simple to copy files or folders and paste symlink somewhere.

This GIF demonstrates how the Quick Symlink allows quite simple to copy files or folders, paste them somewhere, and replace them with symlinks.

These GIFs demonstrate the `Quick Symlink` localization.

🎚 Features

  • Create a symbolic links in a several clicks via the context menu instead of the terminal promt:

    • Select files or folders and create symlinks for them.
    • Copy files or folders and paste symlinks somewhere.
    • Copy files or folders, paste them somewhere, and replace them with symlinks.
  • Create a hard links in a several clicks via the context menu instead of the terminal promt:

    • Select files or folders and create hard links for them.
    • Copy files or folders and paste hard links somewhere.

To Do

  • For more information on an upcoming development, please read the todo list.

Changelog

  • For more information on releases, features and changes, please read the changelog notes.

🚦 Getting Started

These instructions allow to get a copy of this project and run it on a local machine.

Prerequisites

Before using it, make sure that follows software are installed on the local machine:

  • OS X 10.10+ - the operating system under which the extention is executing.

If any of the listed programs is not installed, then it can be installed by instruction as described below.

  1. OS X 10.10+

    • Install macOS 10.10+ by this instruction.

Installing

In order to install it is quite simple to:

  1. Download executable file from releases (or compile it from the sources).

  2. Go to the directory where you download this tool (optionally):

    • via Finder.
    • via Terminal prompt.
    cd /{path to parent dir with this tool}/
  3. Launch the tool in macOS (optionally):

    • via double-click on quick-symlink.app.
    • via Terminal prompt.
    open quick-symlink.app
  4. Open up System Preferences > Extensions and enable the follows extensions: 4.1. quick-symlink-extension - for the symlink actions. 4.2. hard-link-actions-extension - for the hard link actions.

Otherwise, it's possible to install and remove the extention using the actual extension bundled into the app.

  1. To install and approve the extension, run this:
pluginkit -a quick-symlink.app/Contents/PlugIns/quick-symlink-extension.appex/
pluginkit -a quick-symlink.app/Contents/PlugIns/hard-link-action-extension.appex/
  1. To remove it, run this:
pluginkit -r quick-symlink.app/Contents/PlugIns/quick-symlink-extension.appex/
pluginkit -r quick-symlink.app/Contents/PlugIns/hard-link-action-extension.appex/
  1. [OPTIONAL] Check/Uncheck the checkbox on the Application window "Use relative path for symlink" to use the relative path instead absolute path for the creating symlinks. By default it's enabled

Downloading

For the downloading executable file or sources to a local machine, just use the follows link and choose a required release:

https://github.com/ololx/quick-symlink/releases/

Cloning

For the cloning this repository to a local machine, just use the follows link:

https://github.com/ololx/quick-symlink.git

Using

This tool allows to:

Create symlinks in the current directory 1. Select folders or files for which a symbolic link is needed.
2. Call the contextual menu by the right-clicking on selected.
3. Select menu item `Symlink actions --> Create symlink for`.
Create symlinks in another directory 1. Select folders or files for which a symbolic link is needed.
2. Call the contextual menu by the right-clicking on selected.
3. Select menu item `Symlink actions --> Copy path from here`.
4. Go to a destination folder.
5. Call the contextual menu by right-clicking on the filder.
6. Select menu item `Symlink actions --> Paste to here`.
Replace objects with symbolic links 1. Select folders or files for which a symbolic link is needed.
2. Call the contextual menu by the right-clicking on selected.
3. Select menu item `Symlink actions --> Copy to clipboard`.
4. Go to a destination folder.
5. Call the contextual menu by right-clicking on the filder.
6. Select menu item `Symlink actions --> Move it here and replace with a link`.
Create hard links in the current directory 1. Select folders or files for which a symbolic link is needed.
2. Call the contextual menu by the right-clicking on selected.
3. Select menu item `Hard link actions --> Create symlink for`.
Create symlinks in another directory 1. Select folders or files for which a symbolic link is needed.
2. Call the contextual menu by the right-clicking on selected.
3. Select menu item `Hard link actions --> Copy path from here`.
4. Go to a destination folder.
5. Call the contextual menu by right-clicking on the filder.
6. Select menu item `Hard link actions --> Paste to here`.

🛠 Built With

  • Xcode - the IDE for the Finder Sync Extension development.

🎉 Contributing

If you want to contribute this project - you are welcome and have fun. Please visit the contributing section for details on this code of conduct, and the process for submitting pull requests.

📝 Code of Conduct

In order to ensure that all is welcoming, please review and abide by the code of conduct.

🗒 Versioning

For the versioning is used Semantic Versioning. For the versions available, see the changelog or the tags on this repository.

©️ Authors

  • Alexander A. Kropotin - Initial work - ololx.

🔏 Licensing

This project is licensed under the MIT license - see the lisence document for details.

FOSSA Status

GitHub

https://github.com/ololx/quick-symlink
Comments
  • 1. Small wishes

    Привет, будет здорово, если вы сможете добавить: английскую локализацию отображение иконок в контекстном меню возможность отключения именно контекстного меню. объединить контекстное меню для ссылок. сделать иконки(finder toolbar) более подходящими для Big Sur. С уважением.

    Reviewed by grylem at 2021-10-05 10:03
  • 2. fatal: can not remove last element from an empty collection

    Runtime error causing fatal crash when using finder extension toolbar actions

    Error was present in prior versions as well

    Steps to reproduce

    1. Enable finder extension in settings

    image

    1. Add actions to finder toolbar

    image

    1. Select 'Create link for'

    image

    1. Attempts to use finder actions again will demonstrate proof of fatal crash, both finder actions and context actions will disappear until manually ending process and reopening application or log in/out or reboot.

    Console crash report

    Process:               quick-symlink-extension [56034]
    Path:                  /Applications/Utilities/quick-symlink.app/Contents/PlugIns/quick-symlink-extension.appex/Contents/MacOS/quick-symlink-extension
    Identifier:            org.ololx.quick-symlink.quick-symlink-extension
    Version:               1.0 (1)
    Code Type:             X86-64 (Native)
    Parent Process:        ??? [1]
    Responsible:           quick-symlink-extension [56034]
    User ID:               ***
    
    Date/Time:             2021-09-11 08:49:13.739 -0500
    OS Version:            macOS 11.5.2 (20G95)
    Report Version:        12
    Anonymous UUID:        0704A1A4-9780-5E31-3D9F-AF8CB5C7572D
    
    Sleep/Wake UUID:       D8D99E98-AA45-4CD3-AFE2-79B50E9B21EC
    
    Time Awake Since Boot: 840000 seconds
    Time Since Wake:       45000 seconds
    
    System Integrity Protection: enabled
    
    Crashed Thread:        2  Dispatch queue: com.apple.NSXPCConnection.user.endpoint
    
    Exception Type:        EXC_BAD_INSTRUCTION (SIGILL)
    Exception Codes:       0x0000000000000001, 0x0000000000000000
    Exception Note:        EXC_CORPSE_NOTIFY
    
    Termination Signal:    Illegal instruction: 4
    Termination Reason:    Namespace SIGNAL, Code 0x4
    Terminating Process:   exc handler [56034]
    
    Application Specific Information:
    Fatal error: Can't remove last element from an empty collection
     
    
    Thread 0:: Dispatch queue: com.apple.main-thread
    0   libsystem_kernel.dylib        	0x00007fff204a72ba mach_msg_trap + 10
    1   libsystem_kernel.dylib        	0x00007fff204a762c mach_msg + 60
    2   com.apple.CoreFoundation      	0x00007fff205d5b2f __CFRunLoopServiceMachPort + 316
    3   com.apple.CoreFoundation      	0x00007fff205d420f __CFRunLoopRun + 1328
    4   com.apple.CoreFoundation      	0x00007fff205d361c CFRunLoopRunSpecific + 563
    5   com.apple.HIToolbox           	0x00007fff28819a83 RunCurrentEventLoopInMode + 292
    6   com.apple.HIToolbox           	0x00007fff288197e5 ReceiveNextEventCommon + 587
    7   com.apple.HIToolbox           	0x00007fff28819583 _BlockUntilNextEventMatchingListInModeWithFilter + 70
    8   com.apple.AppKit              	0x00007fff22ddb172 _DPSNextEvent + 864
    9   com.apple.AppKit              	0x00007fff22dd9945 -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 1364
    10  com.apple.AppKit              	0x00007fff22dcbc69 -[NSApplication run] + 586
    11  com.apple.AppKit              	0x00007fff22d9fe6c NSApplicationMain + 816
    12  libxpc.dylib                  	0x00007fff2022b3eb _xpc_objc_main + 919
    13  libxpc.dylib                  	0x00007fff2022acd3 xpc_main + 116
    14  com.apple.Foundation          	0x00007fff21384986 -[NSXPCListener resume] + 262
    15  com.apple.pluginkit.framework 	0x00007fff2b0e0c17 0x7fff2b0c5000 + 113687
    16  com.apple.pluginkit.framework 	0x00007fff2b0e089f 0x7fff2b0c5000 + 112799
    17  com.apple.pluginkit.framework 	0x00007fff2b0e0fdd 0x7fff2b0c5000 + 114653
    18  com.apple.ExtensionKit        	0x00007fff318f803c EXExtensionMain + 70
    19  com.apple.Foundation          	0x00007fff213f360f NSExtensionMain + 208
    20  libdyld.dylib                 	0x00007fff204f7f3d start + 1
    
    Thread 1:: com.apple.NSEventThread
    0   libsystem_kernel.dylib        	0x00007fff204a72ba mach_msg_trap + 10
    1   libsystem_kernel.dylib        	0x00007fff204a762c mach_msg + 60
    2   com.apple.CoreFoundation      	0x00007fff205d5b2f __CFRunLoopServiceMachPort + 316
    3   com.apple.CoreFoundation      	0x00007fff205d420f __CFRunLoopRun + 1328
    4   com.apple.CoreFoundation      	0x00007fff205d361c CFRunLoopRunSpecific + 563
    5   com.apple.AppKit              	0x00007fff22f6123a _NSEventThread + 124
    6   libsystem_pthread.dylib       	0x00007fff204dc8fc _pthread_start + 224
    7   libsystem_pthread.dylib       	0x00007fff204d8443 thread_start + 15
    
    Thread 2 Crashed:: Dispatch queue: com.apple.NSXPCConnection.user.endpoint
    0   libswiftCore.dylib            	0x0000000107f02170 specialized _fatalErrorMessage(_:_:file:line:flags:) + 96
    1   libswiftCore.dylib            	0x0000000107d4b7ae RangeReplaceableCollection<A>.removeLast() + 590
    2   org.ololx.quick-symlink.quick-symlink-extension	0x0000000107ca0c0b CopyPathAction.execute() + 699
    3   org.ololx.quick-symlink.quick-symlink-extension	0x0000000107c983b7 FinderSync.copyPathToClipboard(_:) + 119
    4   org.ololx.quick-symlink.quick-symlink-extension	0x0000000107c98408 @objc FinderSync.copyPathToClipboard(_:) + 56
    5   com.apple.finder.FinderSync   	0x00007fff6ea3265e -[FIFinderSyncExtension executeCommandWithMenuItemDictionary:target:items:] + 298
    6   com.apple.Foundation          	0x00007fff213c91be __NSXPCCONNECTION_IS_CALLING_OUT_TO_EXPORTED_OBJECT_S3__ + 10
    7   com.apple.Foundation          	0x00007fff2136db6f -[NSXPCConnection _decodeAndInvokeMessageWithEvent:flags:] + 2246
    8   com.apple.Foundation          	0x00007fff21325039 message_handler + 206
    9   libxpc.dylib                  	0x00007fff20222c24 _xpc_connection_call_event_handler + 56
    10  libxpc.dylib                  	0x00007fff20221a9b _xpc_connection_mach_event + 938
    11  libdispatch.dylib             	0x00007fff203328a6 _dispatch_client_callout4 + 9
    12  libdispatch.dylib             	0x00007fff20349aa0 _dispatch_mach_msg_invoke + 444
    13  libdispatch.dylib             	0x00007fff20338493 _dispatch_lane_serial_drain + 263
    14  libdispatch.dylib             	0x00007fff2034a5e2 _dispatch_mach_invoke + 484
    15  libdispatch.dylib             	0x00007fff20338493 _dispatch_lane_serial_drain + 263
    16  libdispatch.dylib             	0x00007fff203390e0 _dispatch_lane_invoke + 417
    17  libdispatch.dylib             	0x00007fff20342c0d _dispatch_workloop_worker_thread + 811
    18  libsystem_pthread.dylib       	0x00007fff204d945d _pthread_wqthread + 314
    19  libsystem_pthread.dylib       	0x00007fff204d842f start_wqthread + 15
    
    Thread 2 crashed with X86 Thread State (64-bit):
      rax: 0x0000000000001e0b  rbx: 0x0000000108098680  rcx: 0x0000000000000000  rdx: 0x00000000000aea80
      rdi: 0x000000010842a080  rsi: 0x0000000108876e00  rbp: 0x0000700004967ba0  rsp: 0x0000700004967b70
       r8: 0x0000000000000030   r9: 0x0000000000000003  r10: 0x00007f8e0de00000  r11: 0x00007f8e0de46f40
      r12: 0x0000000108097b79  r13: 0x000000000000000b  r14: 0x0000000000000002  r15: 0x0000000000000032
      rip: 0x0000000107f02170  rfl: 0x0000000000010202  cr2: 0x00000001028f7000
      
    Logical CPU:     3
    Error Code:      0x00000000
    Trap Number:     6
    
    Reviewed by zgover at 2021-09-12 12:27
  • 3. Add license scan report and status

    Your FOSSA integration was successful! Attached in this PR is a badge and license report to track scan status in your README.

    Below are docs for integrating FOSSA license checks into your CI:

    Reviewed by fossabot at 2021-12-23 10:42
  • 4. Bug fixes and some changes items

    [0.10.4] - 2021-10-10

    Fixed

    • Fix incorrect link location after creation.

    [0.10.3] - 2021-10-07

    Added

    • Add the checkbox item on the contextual menu of the soft link extention to switch on/off the relative path use to create a symbolic link.

    for more details see #12

    Reviewed by ololx at 2021-10-10 09:38
  • 5. Incorrect link location after creation

    When using the "create a symlink" or "create a hard link" function, the symlink or hard link is created in the wrong directory.

    To Reproduce Steps to reproduce the behavior:

    1. Go to some folder (for instance - home directory of user)
    2. Right click on the some place in the finder window (do not select any folders or files)
    3. Choose the follows items (optionally):
      • Symlink actions -> create link
      • Hard link actions -> create link

    Actual behavior Links (symlinks or hard links) are created in the parent of the current directory

    Expected behavior Links (symlinks or hard links) are created in the current directory

    Desktop:

    OS: macOS Mojave Version: 10.14.6

    Reviewed by ololx at 2021-10-10 09:20
  • 6. Switch on/off the relative path use to create a symbolic link

    [0.10.0] - 2021-09-18

    Added

    • Add the checkbox button on the application view to switch on/off the relative path use to create a symbolic link.
    • Implement the strategy for create new symlink with relative or absolute path.
    Reviewed by ololx at 2021-09-18 03:57
  • 7. Fix fatal error: Can not remove last element from an empty collection

    [0.8.1] - 2021-09-13

    Fixed

    • Fix a bug that led to fatal error: Can't remove last element from an empty collection.

    Added

    • Added the ability to create links from the Finder menu without selected objects.

    See #6 for more details

    Reviewed by ololx at 2021-09-13 14:45
  • 8. Add the relative path usage instead absolute path in symlink target URL

    [0.7.0] - 2021-08-22

    Added

    • Added new classes Path for working with path's and creating relative path from specified directory.
    • Add unit-tests cases for the Path class.

    Changed

    • Change soft link creation using relative instead absolute path.

    See #3 for more details

    • https://github.com/ololx/quick-symlink/issues/3#issuecomment-903063014
    • https://github.com/ololx/quick-symlink/issues/3#issuecomment-903069360
    Reviewed by ololx at 2021-08-22 15:16
  • 9. feat(action): additional options to specify link guidelines

    Request of additional actions

    1. Ability to specify hard vs soft symbolic link type
    2. Option to use relative or absolute paths or combination of for target/destination
      1. Enables support for cross-device file systems
    3. Action panel for existing symbolic links
      1. (if broken) process to browse finder for 'Find/fix missing target'
      2. Modify existing paths and symbolic link features

    Thoughts or reservations?

    Reviewed by zgover at 2021-08-12 12:09
slider view for choosing categories. add any UIView type as category item view. Fully customisable
slider view for choosing categories. add any UIView type as category item view. Fully customisable

CategorySliderView Horizontal or vertical slider view for choosing categories. Add any UIView type as category item view. Fully customisable Demo Inst

Mar 22, 2022
PagingKit provides customizable menu UI. It has more flexible layout and design than the other libraries.
PagingKit provides customizable menu UI. It has more flexible layout and design than the other libraries.

PagingKit provides customizable menu & content UI. It has more flexible layout and design than the other libraries. What's this? There are many librar

May 9, 2022
Library provides easy to implement variation of Android (Material Design) Floating Action Button for iOS. You can use it as your app small side menu. 🌶
Library provides easy to implement variation of Android (Material Design) Floating Action Button for iOS. You can use it as your app small side menu. 🌶

RHSideButtons ?? Library provides easy to implement variation of Android (Material Design) Floating Action Button for iOS. You can use it as your app

May 3, 2022
SwiftySideMenu is a lightweight and easy to use side menu controller to add left menu and center view controllers with scale animation based on Pop framework.
SwiftySideMenu is a lightweight and easy to use side menu controller to add left menu and center view controllers with scale animation based on Pop framework.

SwiftySideMenu SwiftySideMenu is a lightweight, fully customizable, and easy to use controller to add left menu and center view controllers with scale

Feb 4, 2022
A Slide Menu, written in Swift, inspired by Slide Menu Material Design
A Slide Menu, written in Swift, inspired by Slide Menu Material Design

Swift-Slide-Menu (Material Design Inspired) A Slide Menu, written in Swift 2, inspired by Navigation Drawer on Material Design (inspired by Google Mat

Oct 17, 2020
Slide-Menu - A Simple Slide Menu With Swift
Slide-Menu - A Simple Slide Menu With Swift

Slide Menu!! Весь интерфейс создан через код

Jan 8, 2022
EasyMenu - SwiftUI Menu but not only button (similar to the native Menu)
EasyMenu - SwiftUI Menu but not only button (similar to the native Menu)

EasyMenu SwiftUI Menu but not only button (similar to the native Menu) You can c

Apr 24, 2022
Swift-sidebar-menu-example - Create amazing sidebar menu with animation using swift
Swift-sidebar-menu-example - Create amazing sidebar menu with animation using swift

 SWIFT SIDEBAR MENU EXAMPLE In this project I create a awesome side bar menu fo

Apr 6, 2022
A menu which can ... BOOM! - iOS
A menu which can ... BOOM! - iOS

VHBoomMenuButton 2.0.0 Comes Finally After the version 2.0.0 has been published on Android platform, I started developing the new version for BMB on i

Apr 19, 2022
a simple macOS menu bar application that shows you the lyrics of current playing spotify track.

lyricsify a simple macOS menu bar application that shows you the lyrics of current playing spotify track.

Sep 16, 2021
A menu bar app to change input source swiftly using shortcuts on macOS Big Sur or later.

Source Switcher A menu bar app to change input sources swiftly using shortcuts on macOS Big Sur and later. View screenshots Introduction This app uses

May 4, 2022
macOS (>11.0) Menu Bar App for WLED
macOS (>11.0) Menu Bar App for WLED

wledQuickControl functions Left click on the Menubar icon will toggle the WLED device On/Off Right click on the Menubar icon: will update the icon/sli

May 11, 2022
SwiftBar - Powerful macOS menu bar customization tool
SwiftBar - Powerful macOS menu bar customization tool

SwiftBar - Powerful macOS menu bar customization tool

May 18, 2022
adb-tools-mac is a macOS menu bar app written in SwiftUI for common adb tools.
adb-tools-mac is a macOS menu bar app written in SwiftUI for common adb tools.

adb-tools-mac is a macOS menu bar app written in SwiftUI for common adb tools.

May 1, 2022
Ambar is a macOS Menu Bar app built with SwiftUI.
Ambar is a macOS Menu Bar app built with SwiftUI.

Ambar Ambar is a macOS Menu Bar app built with SwiftUI. It is a template project which means that it can be used as a starting point for a new Menu Ba

Apr 25, 2022
Barber lives in your macOS menu bar and keeps track of what needs to be updated.

Barber Barber is a macOS application to keep track of application updates easily. It lives in your menu bar, and uses homebrew to determine what's out

Nov 30, 2021
Control your display's brightness from the macOS menu bar. Simple and easy to use.
Control your display's brightness from the macOS menu bar. Simple and easy to use.

MonitorControl Lite Control your display's brightness from the macOS menu bar. Simple and easy to use. About MonitorControl Lite is a simplified versi

May 9, 2022
macOS menu bar app that displays the current status of SIP (System Integrity Protection)
macOS menu bar app that displays the current status of SIP (System Integrity Protection)

MenuBarSIPDetector This is a DEMO app for my Swift library TINURecovery and it is a macOS menu bar app that displays the current status of SIP (System

Apr 2, 2022
Let's put notification Messages icon on menu bar of your macOS
Let's put notification Messages icon on menu bar of your macOS

DockBar DockBar is just a simple app that show messages icon on your status bar when you have unread messages. This app is very useful for people who

Dec 27, 2021