2016-10-29 3 views
1

Можем ли мы grep для нескольких шаблонов в папке, содержащей n количество файлов. И если совпадение, найденное для каждого шаблона, создает каталог и толкает файлы аналогичного типа в тот же каталог, что и другие.Grep для нескольких шаблонов в папке, содержащей n количество файлов. И если найденное совпадение для шаблонов создает mkdir

Например: У меня есть имя папки: X. X может иметь несколько подпапок и несколько файлов внутри них.

Я хочу найти шаблон, подобный This code is from. Если совпадение этой строки встречается в нескольких файлах в папке X, создайте каталог с именем dir1 и нажмите все файлы с соответствием на dir1.

И то же самое для других шаблонов соответствует также, если совпадения найдены, создают каталоги и толкают файлы в соответствующие каталоги.

Я попытался найти с помощью grep, чтобы найти все файлы с образцами, но параллельно я не могу сделать mkdir. Таким образом, для n совпадений шаблонов в X n dir он должен создать. Поиск в порядке, но проблема с созданием каталогов параллельно.

+0

See - http://stackoverflow.com/help/mcve –

+0

Ok это часть MkDir реж; Grep -irl "Версия" | xargs cp -t dir/ Я могу создать каталог и вытолкнуть все файлы, соответствующие тексту здесь. iam получает ошибку, например, cp: не будет перезаписывать just-create. И в моем случае мне нужна такая же структура папок с файлом, который будет скопирован внутри этого каталога. –

ответ

0

один способ получить ту же самую структуру папок, к сожалению, не использовать xargs cp -t dir, но вместо того, чтобы скопировать один-на-один с Rsync, например,

grep -irl "Version" | xargs -I{} rsync -a "{}" "dir/{}" 
0

Я имею в виду, это не элегантно, но вы может использовать встроенные для циклов с массивом строк поиска.

EDIT: пропущен раздел о отдельных папках для разных строк соответствия. Ниже перечислены изменения.

#!/bin/bash 
#Assuming: 
#patarr is an array containing all paterns 
#test/files is the location of files to be searched 
#test/found is the location of matching files 

for file in test/files/* #*/ 
#This loop runs for every file in test/files/. $file holds the filename of the current file 
do 
    for ((i=0;i<${#patarr[@]};i++)) 
    #This loop runs once for every index in the patarr array. $i holds the current loop number 
    do 
     if [[ $(cat $file | grep ${patarr[$i]} | wc -l) -gt 0 ]] 
     #if grep finds at least one match using the pattern in patarr with index "i" 
     then 
      #cp $file temp/found/ #Old code, see edit above 
      mkdir -p temp/found/${pararr[$i]} 
      #Makes a folder with the name as our search string. -p means no error if the folder already exists. 
      cp $file temp/found/${pararr[$i]}/ 
      #Copies the file into said folder 
     fi 
    done 
done