2017-01-13 3 views
1

У меня есть файловая структура, в которой у меня есть 700 каталогов. Все каталоги имеют файл с именем config.xml. У меня есть префикс 25 каталогов с именем 1111-. Теперь я хочу заменить блок кода в файлах config.xml из всех этих 25 каталогов. Я хочу иметь петлю (for или while).Bash - Найти и заменить строку в файле в количестве каталогов

+1

Что написано до сих пор? – codeforester

ответ

1

Вы можете найти файл с find, grep Директории и заменить строку, используя sed.

find . -iname 'config.xml' | grep '1111' | sed -i 's/STRINGTOREPLACE/NEWSTRING/' 
+0

Что делать, если файл config находится в подкаталоге одной из этих 1111 папок. grep получил бы это тоже, и я не думаю, что @Drew этого хочет. –

+0

hmm. в этом случае можно использовать параметр -depth. – OhadBasan

+0

Возможно, 'ls 1111 - */config.xml' проще, чем' find ... ' –

2

Я хотел бы использовать рекурсивную функцию:

folder_recursive() { 
    for i in "$1"/*;do 
     if [ -d "$i" ];then 
      folder_recursive "$i" 
     elif [ -f "$i" ]; then 
      lastFolder = ${$1##*/} 
      if [[ $lastFolder == *"1111-"* ]]; then 
       if [[ $i == *"config.xml" ]]; then 
        #Replace block of code 
        file_path=$i 
        original=$(<file_path) # Read from file 
        to_replace="aaaabbbb" 
        replacer="xxxxyyyy" 
        result=${original/$to_replace/$replacer} #This will replace the first instance of to_replace 
        # If you want to replace all instances use: 
        # ${original//$to_replace/$replacer} 
        echo $result > $i #Overwrite file 
       fi 
      fi 
     fi 
    done 
} 

path= "root/of/folder/structure" 
folder_recursive $path 
+0

Как это рекурсивная функция? – NinjaGaiden

+0

извините опечатку в коде –

+0

@Luca: Я не уверен, как это заменит код. Когда я собираюсь рассказать этой функции о поиске конкретной строки (-ов) кода, а затем заменить ее на новую! Пожалуйста, черт! – Drew

1

Попробуйте это:

find . -name "1111-*" -type d -exec cd {} \; -exec /absolute.path/to/shell_script_modifying_config.xml \; 
+0

Я не использую grep. Команда find, которую я предоставил, ищет каталоги, начиная с 1111-. Затем он записывается в эти каталоги и запускает сценарий оболочки. Поэтому он не попадает в подкаталоги 1111-папок. –

Смежные вопросы