2015-09-08 5 views
-1

Я пытаюсь grep, копировать и переименовывать файлы, скопированные в пункт назначения. Итак, в основном я хочу посмотреть в каталоге для файла, который содержит определенную строку, и скопировать эти файлы, когда я нахожу совпадение с помощью grep и переименовываю их после копирования. Я читал много, но я не могу понять, как это понять. Вот мой сценарийGrep and Copy - Bash Scripting

for file in $(grep -R 'myname' /searchdirectory) 
do 
cp -t $file /destinationfolder 
done 

Это не работает. Как только я это понял, мне нужно выяснить, как переименовать. Любая помощь будет оценена.

+0

если вы хотите сделать рекурсивный поиск и по-прежнему получать fullpaths, 'find' может быть лучшей идеей, чем' grep' –

+1

вам нужно добавить '-l' аргумент Grep, чтобы получить имя файла. – pcantalupo

+0

Переименуйте, как именно? –

ответ

1

У вас есть несколько вариантов. В большинстве современных систем вы можете использовать xargs:

grep -l --null "$pattern" "$srcPath" | 
    xargs -0 -I{} cp {} "$destPath" 

В любой системе, совместимой с POSIX вы можете использовать find:

find "$srcPath" -maxdepth 1 -type f -exec grep -q "$pattern" {} \; \ 
    -exec cp {} "$destPath" + 

две вещи неправильно с вашим подходом:

  1. Вам нужны флаг -l - grep.
  2. Вы не учитываете пробел и расширение glob при замене команд, что может стать кошмаром.
+0

Мне удалось скопировать файлы, теперь как распечатать файлы, которые были скопированы. Или как эхо копировать файлы? Мне также необходимо изменить расширение файлов, которые были скопированы. Вот что я использую: grep -l -r -i -z 'stringsearch'/sourcedirectory | xargs -i {} cp -p {}/destination – Sam

+0

Попробуйте 'xargs -i bash -c 'cp {} destination; echo {}'' –

0

Используйте grep -l вместо простого grep command.

Вы используете простую команду grep, и она содержит как имя файла, так и выход. Но если вы используете опцию -l, то в ней перечислены только имена файлов, а затем вы можете скопировать их в цикле for.

for file in $(grep -l -R 'myname' /searchdirectory) 
do 
cp -t $file /destinationfolder 
done