Try using grep -L to list files that don't match.
find $pathname -type f \( -name "*message.txt*" -or -name "*comma2*" -or -name "*comma3*" \) | xargs egrep -L ";|,|\|" | xargs -IX mv X $pathname/mvfiles
In the above example, I use egrep because of the pipe'd OR conditions. That is, we want to specify multiple regexs to match. If the file contains any of ; , | , the filename will not be output by egrep. This leaves only files that don't match being passed to xargs. In the mac version of xargs, you can specify a replacement string with the -I parameter. For every filename output by egreg, xargs will call mv <filename> $pathname/mvfiles.
As part of a follow up question, I was asked how to only review the second line of the file. Here's a bit of code to do just that:
awk ' FNR == 2 && /[;|,]/ { print FILENAME } ' *
The above awk will display the current filename (FILENAME) when the file record number (FNR) is 2 (the second line in each file) and the input string matches the regex [;|,].
To inject that bit of code in my answer above, you can do this:
find $pathname -type f \( -name "*message.txt*" -or -name "*comma2*" -or -name "*comma3*" \) | xargs awk ' FNR == 2 && /[;|,]/ { print FILENAME } ' | xargs -IX mv X $pathname/mvfiles
So above, I replaced the 'xargs egrep' with 'xargs awk'. Also, I removed the * from the end of awk command because that's basically xargs default function - to take all of the input on stdin and provide it as input to the command ( in this case, awk ).
Since we are using awk, we can actually avoid the last use of xargs to move the files. Instead, we can build the commands and pipe them to bash (or some shell).
Here's a version where we pipe commands to bash:
find $pathname -type f \( -name "*message.txt*" -or -name "*comma2*" -or -name "*comma3*" \) | xargs awk ' FNR == 2 && /[;|,]/ { print "mv " FILENAME " '$pathname'/mvfiles" } ' | bash
If you want to just debug the above statement without taking actions, you can remove the bash command at the end to leave this debug version:
Debug version (doesn't move files - only prints mv commands):
find $pathname -type f \( -name "*message.txt*" -or -name "*comma2*" -or -name "*comma3*" \) | xargs awk ' FNR == 2 && /[;|,]/ { print "mv " FILENAME " '$pathname'/mvfiles" } '