Couldn't find my old script, fortunately, because this one is better
my_libs <- dir("/Library/Frameworks/R.framework/Versions/3.6/Resources/library")
options(install.packages.check.source = "no")
install.packages(my_libs)
You can use this next time. It's long running with that many packages. For 300 packages over a 500Mbps connection, it take about a half hour.
It won't bring in packages originally install from non-CRAN sources or packages requiring compilation, because otherwise the script couldn't be run unattended as it would prompt periodically to get user input.
In general, most macOS users should only install binary versions, even if the source version is later. Most CRAN packages get binary versions 7-10 days after the source version become available. When installing packages individually it doesn't hurt to choose the install from source option and it will often work. If it doesn't work the first time, however, trying to troubleshoot it is not worth the time for anyone but advanced level users.
For the versions manually copied over, some will need to be re-installed because they depend on language feature missing from 3.x versions. That's the first thing to try.
In general, it's good practice not to lag behind R versions too much. Being on 4.1 rather than 4.2 is usually not a problem, but if it were to get up to 4.5, say, expect breakage—some packages will continue to work, others not.