I have written a bash script on my MacMini to execute anytime a file has completed downloading. After the file download is complete, the mac mounts my NAS, renames the file, and then copies the file from the mac to the NAS, deletes the file from the mac and then unmounts the NAS.
My issue is, sometimes, the NAS takes a few seconds to mount. When that happens, I receive an error that the file could not be copies because the directory doesn’t exist.
When the NAS mounts instantly, (if the file size is small), the file copies and then the file deletes and the NAS unmounts.
When the file size is large, the copying process stops when the file is deleted.
What I’m looking for is, how do I make the script “wait” until the NAS is mounted, and then how do I make the script again wait until the file copying is complete?
Thank you for any input. Below is my code.
#connect to NAS open 'smb://username:password@ip_address_of_NAS/folder_for_files' #I WANT A WAIT COMMAND HERE SO THAT SCRIPT DOES NOT CONTINUE UNTIL NAS IS MOUNTED #move to folder where files are downloaded cd /Users/account/Downloads #rename files and copy to server for f in *; do newName="${f/)*/)}"; mv "$f"/*.zip "$newName".zip; cp "$newName".zip /Volumes/folder_for_files/"$newName".zip; #I NEED SCRIPT TO WAIT HERE UNTIL FILE HAS COMPLETED ITS TRANSFER rm -r "$f"; done #unmount drive diskutil unmount /Volumes/folder_for_files
Advertisement
Answer
I have no longer a mac to try this, but it seems open 'smb://...'
is the only command here that does not wait for completion, but does the actual work in the background instead.
The best way to fix this would be to use something other than open
to mount the NAS drive. According to this answer the following should work, but due to the lack of a mac and NAS I cannot test it.
# replace `open ...` with this osascript <<< 'mount volume "smb://username:password@ip_address_of_NAS"'
If that does not work, use this workaround which manually waits until the NAS is mounted.
open 'smb://username:password@ip_address_of_NAS/folder_for_files' while [ ! -d /Volumes/folder_for_files/ ]; do sleep 0.1; done # rest of the script