Попробуйте использовать grep -L для вывода списка файлов, которые не совпадают.
find $pathname -type f \( -name "*message.txt*" -or -name "*comma2*" -or -name "*comma3*" \) | xargs egrep -L ";|,|\|" | xargs -IX mv X $pathname/mvfiles
В приведенном выше примере я использую egrep из-за условий OR для pipe.То есть мы хотим указать несколько регулярных выражений для соответствия.Если файл содержит любой из;, |имя файла не будет выводиться egrep.Это оставляет только файлы, которые не соответствуют, передаются в xargs.В версии xargs для Mac вы можете указать строку замены с параметром -I.Для каждого имени файла, выводимого egreg, xargs будет вызывать mv $ pathname / mvfiles.
В рамках дополнительного вопроса меня спросили, как просмотреть только вторую строку файла.Вот небольшой код для этого:
awk ' FNR == 2 && /[;|,]/ { print FILENAME } ' *
Приведенный выше awk будет отображать текущее имя файла (FILENAME), когда номер записи файла (FNR) равен 2 (вторая строка в каждом файле) ивходная строка соответствует регулярному выражению [; |,].
Чтобы вставить этот бит кода в мой ответ выше, вы можете сделать это:
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
Итак, выше, я заменил 'xargs egrep' на 'xargs awk'.Кроме того, я удалил * из конца команды awk, потому что это, по сути, функция xargs по умолчанию - взять все входные данные в stdin и предоставить их в качестве входных данных для команды (в данном случае awk).
Так какмы используем awk, мы можем фактически избежать последнего использования xargs для перемещения файлов.Вместо этого мы можем построить команды и направить их в bash (или какую-либо оболочку).
Вот версия, в которой мы передаем команды в bash:
find $pathname -type f \( -name "*message.txt*" -or -name "*comma2*" -or -name "*comma3*" \) | xargs awk ' FNR == 2 && /[;|,]/ { print "mv " FILENAME " '$pathname'/mvfiles" } ' | bash
Если вы хотите просто отладитьВышеупомянутое утверждение без каких-либо действий, вы можете удалить команду bash в конце, чтобы оставить эту отладочную версию:
Отладочная версия (не перемещает файлы - только печатает команды mv):
find $pathname -type f \( -name "*message.txt*" -or -name "*comma2*" -or -name "*comma3*" \) | xargs awk ' FNR == 2 && /[;|,]/ { print "mv " FILENAME " '$pathname'/mvfiles" } '