2015-06-20 5 views
0

У меня есть папка, полные каталоги/файлы с пробелами в именах, и я хочу, чтобы скопировать все *.ttf файлов в другой каталог для папок, кроме Consolas и System Volume Information , После this поста, я попробовал:Попытка Grep находку -print0 вызывает странное поведение

find ... -print0 | grep -v "System Volume Information" --null | grep -v "Consolas" --null | xargs -0 cp -t destination 

По некоторым причинам, это приводит к Binary file (standard input) matches сообщения от первой Grep. Использование объединить задать расширенные фильтры, я попытался:

find . -name '*.ttf' -print0 | egrep -v "(System Volume Information)|(Consolas)" --null | xargs... 

Но в этом случае не будет задать расширенную распечатайте ничего к терминалу, хотя есть много других папки, кроме System Volume Information и Consolas. Когда я удалил все, кроме части команды find, я получил один большой фрагмент текста без новых строк, из-за опции -print0. Так как весь блок включал Consolas, опустив его, я опускал все. Я подтвердил это, когда попытался сделать grep Arial по результатам, и весь блок был распечатан.

Как предотвратить это поведение в grep?

+1

Вы говорите 'find' для вывода списка с нулевым завершением, вы не говорите' grep' для чтения списка с нулевым завершением, вам нужны дополнительные '--null-data' для' greps' – BroSlow

+0

@ BroSlow после нескольких часов поиска, большое спасибо за '--null-data' и не ошибаюсь' -Z' и '-z' !! –

ответ

-1

Ожидается, что использование опции «-v» для grep. Это делает то, о чем вы говорите, не давая вам никаких строк, содержащих Консолас. Чтобы избежать этого, не используйте -print0 и не отправляйте процесс с помощью xargs (как вы уже обнаружили), или если вам действительно нужно все вместе запускать, сделайте это после фильтров grep -v через что-то вроде этого:

echo -n $ (find. -name '* .ttf' | grep -v "Информация о объеме системы" --null | grep -v "Consolas" --null)

, но вам, вероятно, это не нужно для эта проблема как xargs является достаточной.

+0

Я попытался сделать 'cp -t dest $ (rest_of_command)', но кажется, что папки с пробелами по-прежнему не обрабатываются должным образом. Возможно, это не проблема 'xargs'? –

+0

Попробуйте следующее. cp -t dest '' echo -n $ (...) '' –