2014-01-29 1 views
2

Я бы хотел найти каталог для любого файла, который соответствует любому из слов. Если файл соответствует, я хотел бы скопировать этот файл в новый каталог. Я создал небольшую партию тестовых файлов и получил следующий код работы:Масштабирование grep найти и скопировать в большую папку (xargs?)

cp `grep -lir 'word\|word2\|word3\|word4\|word5' '/Users/originallocation'` '/Users/newlocation' 

К сожалению, когда я запускаю этот код на большой папке с несколькими тысячами файлов, которые он говорит, что список аргументов слишком длинный для cp. Я думаю, мне нужно зацикливать это или использовать xargs, но я не могу понять, как сделать преобразование.

ответ

3

Минимальное изменение от того, что вы должны были бы быть:

grep -lir 'word\|word2\|word3\|word4\|word5' '/Users/originallocation' | \ 
    xargs cp -t '/Users/newlocation' 

Но, не использовать. Поскольку вы никогда не знаете, когда вы столкнетесь с именем файла с пробелами или новыми символами в нем, следует использовать строки с нулевым завершением. На Linux/GNU, добавьте параметр -Z к Grep и -0 к xargs:

grep -Zlir 'word\|word2\|word3\|word4\|word5' '/Users/originallocation' | \ 
    xargs -0 cp -t '/Users/newlocation' 

На компьютерах Mac (и AIX, HP-UX, Solaris, * BSD), параметры GREP немного измениться, но, что более важно , опция GNU cp -t недоступна. Обходной путь:

grep -lir --null 'word\|word2\|word3\|word4\|word5' '/Users/originallocation' | \ 
    xargs -0 -I fname cp fname '/Users/newlocation' 

Это менее эффективно, так как новый экземпляр cp должен быть запущен для каждого файла должен быть скопирован.

+0

+1: Обратите внимание, что '-t вариант target' в GNU' cp' очень полезно, но не везде с другими вариантами 'cp'. –

+0

@JonathanLeffler Да, я просто добавил обходное решение. Существуют ли какие-либо важные платформы помимо Mac, которым не хватает '-t'? – John1024

+1

Это зависит от вашего определения «важно». AIX, HP-UX, Solaris, * BSD затронуты; в основном, это только платформы, которые используют GNU core utils (или около того), которые имеют это, и AFAIK, что означает Linux, и все остальное Unix-подобного не делает. У меня еще нет доступа к AIX, HP-UX, Solaris (за последние 9 месяцев или около того), но с тех пор они, вероятно, не изменились. –

1

Альтернативное решение для тех, у кого нет grep -r. Используя find + egrep + xargs, надеемся, что в разных папках нет файла с тем же именем файла. Во-вторых, я заменил уродливый стиль word\|word2\|word3\|word4\|word5

find . -type f -exec egrep -l 'word|word2|word3|word4|word5' {} \; |xargs -i cp {} /LARGE_FOLDER 
+0

Ваши кавычки несовместимы. Кроме того, если 'egrep -lr' и' xargs' могут выполнять задание, как в ответе @ John1024, в чем преимущество добавления 'find' в микс? – mklement0

+0

Моя система (solaris) не поддерживает 'grep -r', эта команда с find будет обычной. Во-вторых, мне не понравился стиль' 'word \ | word2 \ | word3 \ | word4 \ | word5'' , личная привычка – BMW

+1

Возможно, вы должны предисловие к своему сообщению с помощью «альтернативного решения для тех, у кого нет« grep -r ». По несовпадающим цитатам я имел в виду, что ваш строковый литерал сломан: он начинается с' "' и заканчивается символом '\' '. – mklement0