It is relatively easy to do via SIS import, using the courses.csv (details here), with the status field set to "deleted". You just need a list of the courses, and you should be able to get it by running a provisioning report, and then just tweaking the resulting file to make it match the fields in the courses.csv.
If you are trying to delete a certain subset of courses, it gets trickier. I deleted a large number of empty and enrollment-less courses a couple of years ago. I had to go through a fairly cumbersome process that involved running the "Unused Courses" report, then the provisioning report for enrollments, then using Excel magic to compare the courses with no enrollments (blank fields) to the courses with no content, so I had a list that had both desired criteria. It's time to do this clean-up again, so I actually hope someone chimes in to this discussion with an easier way
This discussion post is outdated and has been archived. Please use the Community question forums and official documentation for the most current and accurate information.