mac - File disappears from Finder when hard link copy is deleted
2014-07
Ok, I just got quite the scare... I have a folder with some important files. Using the Terminal I had created hard-links to those files in a different folder. Something like this:
mkdir test
ln important-files/* test/
All well and good. I had a Finder window open in the important-files
folder, and in the Terminal I then decided to delete my test folder with the hard-links:
rm -rf test/
Now comes the scary part... in the important-files
Finder window , the files started to disappear!
Turns out it was just Mac OS X being "funny" like it often is. The files were still there if I did an ls important-files/
. But the only way to get them back in the Finder was to do a killall Finder
.
What in the world is going on here? Why is it doing this?
Update: Is this a bug in Mac OS X 10.4 or something? I seem to get less scary behavior on an iMac with 10.5 here...
The OS X filesystem event API uses paths in the callback, so this must be Finder being stupid and resolving to inodes for its internal cache. A path linked to a specific inode disappears, so all entries linked to that inode disappear.
Is there a way to get the same functionality as the unix command ln -s
in the Mac OS X Finder (OS 10.5)? I want to be able to create symbolic links while working in Finder windows without opening the Terminal.
Note that the Make Alias
command in Finder is not what I want because those aliases cannot be navigated in the Terminal (but links created with ln -s
can be navigated by both the Terminal and Finder).
What about that creating symbolic links in the Finder via AppleScript ?
Here's the most relevant script in that link:
on run
open {choose file with prompt "Choose a file to create a symbolic link:" without invisibles}
end run
on open the_files
repeat with i from 1 to (count the_files)
try
set posix_path to POSIX path of (item i of the_files)
if posix_path ends with "/" then set posix_path to text 1 thru -2 of posix_path
do shell script "ln -s " & quoted form of posix_path & " " & quoted form of (posix_path & ".sym")
end try
end repeat
end open
Just paste it into AppleScript Editor and save it as an application. Then you can drag it over your finder's toolbar or link it on the dock.
SymbolicLinker will do exactly what you're looking for, and it's free.
An applescript at the link provided by user nuc answered my question. Here is the applescript reproduced in case that link disappears.
I preferred the script given by the commenter jonn8n, which was also reproduced as Macworld article.
on run
open {choose file with prompt ¬
"Choose a file to create a symbolic link:" without invisibles}
end run
on open the_files
repeat with i from 1 to (count the_files)
try
set posix_path to POSIX path of (item i of the_files)
if posix_path ends with "/" then set posix_path to ¬
text 1 thru -2 of posix_path
do shell script "ln -s " & quoted form of posix_path ¬
& " " & quoted form of (posix_path & ".sym")
end try
end repeat
end open
I saved this as an application using Script Editor and dragged the application to the Finder sidebar so I can now create symbolic links by dragging files or folders onto the application icon.
Path Finder adds this to your Finder, and adds a lot more features.
A possible improvement on this script would be changing the run handler to use the currently selected files from the Finder, as so:
on run
tell application "Finder" to set sel to selection
open sel
end run
on open the_files
repeat with i from 1 to (count the_files)
try
set posix_path to POSIX path of (item i of the_files as alias)
if posix_path ends with "/" then set posix_path to ¬
text 1 thru -2 of posix_path
try
do shell script "ln -s " & quoted form of posix_path ¬
& " " & quoted form of (posix_path & ".sym")
on error
try
do shell script "ln -s " & quoted form of posix_path ¬
& " " & quoted form of (posix_path & ".sym") with administrator privileges
end try
end try
end try
end repeat
end open
You could also edit [application]/Contents/Info.plist to add
<key>LSUIElement</key>
<true/>
Just before the last </dict>. This would mean the app would run in the background, and wouldn't come to the front when you clicked on it.
Also, in Snow Leopard where SymbolicLinker doesn't work, you can create a Service with Automator to do either the Terminal command or AppleScript to create a symbolic link.
One more AS:
tell application "Finder"
repeat with f in (get selection)
set p to POSIX path of (f as text)
set p2 to POSIX path of (desktop as text) & name of f
do shell script "ln -s " & quoted form of p & " " & quoted form of p2
end repeat
end tell
Try looking here : http://www.techiecorner.com/528/how-to-create-shortcut-in-mac-os-x/
This is built into OSX already if you press the control key when you click on something.