I had a similar problem where I needed to copy files from one directory to another and continue on errors. The idea was to copy as much as possible with the help of an operating system (in my case Debian) tool and then handle possible errors manually.
I used the hint Julie Pelletier provided in her comment to use rsync. Also I used this answer as template as I wanted to be able to analyze the copy operations which fail.
In summary the solution for your case could be
rsync --archive --itemize-changes --delete /d/ /sdcard/test/
Explanation: rsync copies the contents of your source path (/d/) to your target path (/sdcard/test/). In case the contents already exist in your target directory only the differences will be written (delta-transfer). This allows to abort and continue the process at any time. Failures will be reported without stopping the overall copy operation. rsync per default only performs a "quick check" using file size and last modified time. More criteria can be set (see below).
--archive specifies a set of file and directory attributes to be checked for differences
--itemize-changes instructs to print a summary for each file. This is very helpful to understand why a file is considered to be different by rsync. This helped me to understand failures of the copy operation. The message is rather cryptic, check the man page to understand it better.
--delete specifies to delete files at the target location which do not exists in your source location.
In my specific case I used a modified set of comparison criteria as I copied from one file system to another. Maybe this is helpful in your case as well:
rsync --recursive --links --safe-links --times --group --owner --devices --specials --delete --human-readable --stats --verbose --itemize-changes --progress --modify-window=3 source/ target/
The most notable changes are:
--safe-links in order to copy only symbolic links within the copied tree
- No
--perms (was implied by --archive) as permissions were not correctly set on the target filesystem
--modify-window=NUM sets a tolerance for the last modification time as those were not correctly set on the target filesystem
ls -l /d/TRRSsay? – Kusalananda Jan 07 '17 at 21:19cp -ris actually meant to do what you're asking. It does accept a force option (-f) but I don't think it would overcome a fatal error like you're getting. – Julie Pelletier Jan 07 '17 at 21:21ls -l /d/TRRSgives:-r--r--r-- root root 0 1969-12-31 19:00 TRRS– josh798 Jan 07 '17 at 21:28ls -la /d/.? – Julie Pelletier Jan 07 '17 at 21:37ls -la /d/.. And just to reiterate, I'm pretty sure I know why it is failing, but I just need a command that can recover from this type of error. – josh798 Jan 07 '17 at 22:16rsync. It would also be possible to do a shell script that first retrieves the file listing, creates the directories, and then just runscpon each filename. You would of course ignore the return code fromcpand just let it go through. – Julie Pelletier Jan 07 '17 at 22:22http://unix.stackexchange.com/a/335663/167583is most relevant. Simply note you don't need the--remove-source-filesoption. – Julie Pelletier Jan 07 '17 at 22:25