Пакетная обработка файлов: Поиск и замена, архивация

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 553
Баллы
113
Пакетная архивация файлов
Где это может пригодится? Например:
  • Можно по завершению работы шаблона упаковывать результат в архив и отправлять на почту (себе или клиенту).
  • Бекапы Hot!
  • Для последующей загрузки (например, на FTP)

Для этой цели мы будем использовать архиватор 7zip, который является бесспорным лидером по качеству компрессии. Да и к тому же он бесплатный :-)

Переходим сюда: http://www.7-zip.org/download.html

И скачиваем 7-Zip Command Line Version

Извлекаем 7za.exe в любую директорию, например, в корень диска C:\, а далее мы поиграемся с командами управления, выполнять которые мы можем, как через Свой код -> Запуск программы, так и через C# кубик.

1 вариант:
2016-05-20_10-38-44.png


«Исполняем файл» - Здесь мы указываем путь до 7za.exe, который мы распаковали ранее.
«Параметры запуска» - А тут расположатся наши команды-параметры (далее Аргументы).

2 вариант:
2016-05-20_10-40-55.png


Код:
var process = new System.Diagnostics.Process {
    StartInfo = new System.Diagnostics.ProcessStartInfo {
     UseShellExecute = false,
     CreateNoWindow = true,
     RedirectStandardError = true,
     RedirectStandardInput = true,
     RedirectStandardOutput = true,
     FileName = "cmd.exe",
     WorkingDirectory = project.Directory+"\\"+project.Variables["f_output"].Value,
     Arguments = @"/c C:\7za.exe "
     +project.Variables["command"].Value+" "
     +project.Variables["zipName"].Value+" "
     +project.Variables["source"].Value
     +" | findstr /I /P /V \"Compressing 7-Zip\""
     }
};
process.Start();
string output = process.StandardOutput.ReadToEnd();
process.WaitForExit();
process.Close();
process.Dispose();
return output;
В проекте должны быть созданы переменные: saveDir, command, zipName и source.
  • saveDir – рабочая папка;
  • command – набор параметров (аргументов);
  • zipName – название архива;
  • source – путь к файлам, которые будем архивировать.
Итак, рассмотрим аргументы подробнее.

Создание архива
Создание архива начинается с команды «a»
Для архивации файлов readme.txt и movie.avi в директории /home/, строка будет выглядеть следующим образом:
Код:
a название_архива.7z и  /home/ readme.txt /home/movie.avi
Если необходимо положить в архив файлы определенного формата, можете воспользоваться маской *.расширение. Чтобы положить все файлы txt и xlsx формата, находящиеся в папке /home/, выполним:
Код:
a название_архива.7z /home/*.txt /home/*.xlsx
Или же может возникнуть обратная ситуация – исключить некоторые файлы (например, все файлы формата logs), тогда аргументы примут следующий вид:
Код:
a название_архива.7z –r -x!*.logs /home/
Для упаковки всего содержимого директории /home/, пишем:
Код:
a название_архива.7z /home/
Архив будет создан в подпапке «Список архивов» корневой директории шаблона.

Можно использовать абсолютный/относительный путь, если не хотите сохранять по стандартному пути, например:
Код:
a C:/архивы/название_архива.7z
или
Код:
a /котики/название_архива.7z
В случае архивации всей директории, не следует указывать путь, как ./home/*, поскольку файлы/папки типа ./home/.htaccess не будут добавлены в архив.

Дополнительные опции архивирования
-r включает рекурсию

-ssw принудительная упаковка файло

-t устанавливает формат архива на выходе
Например, -t7z выдаст 7z архив (используется по умолчанию).
Также доступны и другие форматы: zip, tar, gzip, wim, xz и bzip2.

-mx эта опция отвечает за метод компрессии (за качество сжатия):
  • -mx0 - Без компрессии
  • -mx1 - Очень быстрая компрессия
  • -mx3 - Быстрая компрессия
  • -mx5 - Нормальная компрессия
  • -mx7 - Максимальная компрессия
  • -mx9 - Ультра компрессия

Как все это будет выглядеть:
Код:
a -t7z –ssw –mx7 –rназвание_архива /home/
-v нужно разделить архивы на части? Не проблема!
  • b – байты
  • k – килобайты
  • m – мегабайты
  • g – гигабайты

Код:
a -t7z –ssw –mx5 –v1024k название_архива /home/
Код:
a -t7z –ssw –mx5 –v7m название_архива /home/
Код:
a -t7z –ssw –mx5 –v3g название_архива /home/
Для тонкой настройки процесса архивации, можно использовать параметры -mfb -md –ms:
  • -mfb=64 – кол-во байт в конце (для LZMA алгоритма)
  • -md=32m – устанавливает размер словаря равным 32мб
  • -ms=on – включает «непрерывный архив»

Код:
a -t7z –ssw –r –mx7 -mfb=64 -md=32m -ms=on название_архива /home/
Требуется защита архива?:
Код:
a -mhe=on -pzennolab название_архива.7z
  • -pzennolab установит пароль «zennolab»
  • -mhe=on разрешит криптование заголовков

Извлечение архива
Распаковка архива начинается с команды «x»
Извлечь архив в подпапку «Список архивов» корневой директории шаблона:
Код:
x название_архива.7z
Если архив разбит на несколько частей (томов), используйте самый первый:
Код:
x название_архива.7z.001
Для того, чтобы извлечь содержимое в другую директорию, воспользуйтесь командой -o
Код:
x название_архива.7z –o C:/тюлени/
Просмотр содержимого архива
Чтобы посмотреть содержимое архива, используется команда «l»
Код:
l название_архива.7z
Ознакомиться со всеми возможностями и командами можно через командую строку: 7za.exe –help или по ссылке: http://www.dotnetperls.com/7-zip-examples
 
Тема статьи
Другое
Номер конкурса статей
Пятый конкурс статей

Вложения

Для запуска проектов требуется программа ZennoPoster или ZennoDroid.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...

Для того чтобы запустить шаблон, откройте нужную программу. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.

Последнее редактирование:

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 553
Баллы
113
Массовый поиск\замена текста в файлах (включая Word)

Встречалась Вам задача поиска и\или замены текста в файлах? Если да, то данный способ облегчит и ускорит сей процесс. Если нет, то просто возьмите на заметку :-)

Где это может пригодится?
  • Данный функционал придется по душе программистам и верстальщикам. Всего в несколько телодвижений, можно настроить, например, массовую серию замен элементов HTMLшаблона или наименование классов.
  • Да и просто там, где это необходимо :-)

Рассмотрим 2 варианта.
Вариант 1: ZennoPoster и @TextReplacer
@TextReplacer – это утилита для поиска и замены многострочных фрагментов текста в файлах указанного каталога и вложенных папок.

Скачать: http://tr.infortech.ru/download/

Правда для её использования вне интерфейса, придет заплатить – зарегистрировать ключ, сразу скажу, что цена смешная, всего 150 рублей за 6 месяцев. Сумма более чем подъемная :bz:

С# кубик:
Код:
var process = new System.Diagnostics.Process {
    StartInfo = new System.Diagnostics.ProcessStartInfo {
     UseShellExecute = false,
     //CreateNoWindow = true,
     RedirectStandardError = true,
     RedirectStandardInput = true,
     RedirectStandardOutput = true,
     FileName = "cmd.exe",
     WorkingDirectory = @"C:\Program Files (x86)\Iteamma\Text Replacer",
     Arguments = "tr.exe"+project.Variables["command"].Value
     }
};
process.Start();
string output = process.StandardOutput.ReadToEnd();
process.WaitForExit();
process.Close();
process.Dispose();
return output;
У Вас должна быть создана переменная command. В ней будут указывать команды-параметры (Аргументы). Результаты выполнения скрипта будут в переменную result.

Давайте рассмотрим несколько ситуаций (набор команд):
Код:
/t style.css /x templaste.css /cp:utf8 /d C:\www\site.ru\
Будет произведена замена «css/style.css» на «templates/css/styles.css» во всех файлах, расположенных в директории C:\www\site.ru\. Текст будет искаться и заменяться в кодировке UTF-8.

Код:
/tУведомление /d С:\Push\ /c /s
Здесь производится только поиск текста «Уведомление» в кодировке ANSI.

Код:
tr /tf C:\input.txt /xf C:\replace.txt /d "C:\Sexy Folder" /r /l logs.txt /is /ir
Данная строка произведет замену текста из файла input.txtна текст файла replace.txt во всех файлах директории SexyFolder. Результаты будут записаны в logs.txt. Игнорируются пробелы, переводы строки и регистр символов. Кодировка ANSI.

Список всех аргументов
Заметки:
1. Если путь содержит пробелы – заключаем его в кавычки.
2. Если текст для поиска находится в Word файле, он не должен превышать 255 символов.


/s Если ключ указан, производим только поиск. Если нет, то будет произведена замена.
/e Маски файлов для поиска. Если параметр отсутствует, используется *.* маска, т.е. поиск будет произведен по всем файлам. Указываются через пробел.
/d Путь к директории с файлами, в которых будет производиться замена.
Если путь содержит пробелы, его необходимо заключить в кавычки. Этот аргумент указывается в обязательном порядке.
/r Включает рекурсию (учёт вложенных папок).
/t Текст для однострочного поиска без пробелов и (/). Для задания произвольного текста воспользуйтесь аргументом /tf.
/tf поиск многострочного текста из файла (Это может быть Word, либо простой текстовой файл в кодировке ANSI). Используется если не указан ключ /t.
/x Текст для однострочной замены без пробелов и (/). Для задания произвольного текста замены необходимо использовать /xf.
/xf Путь к файлу с текстом для замены, используется, если не указан /x. Файл может быть документом Word, либо текстовым в кодировке ANSI.
/cp аргумент указывает, в какой кодировке производить поиск и замену. Кодировка поиска влияет на искомые файлы и не влияет на файлы, задаваемые ключами /tf и /xf.
Если ключ не указан, используется кодировка ANSI.
Примеры:
  • /cp:ansi, /codepage:ansi Устанавливает кодировку ANSI
  • /cp:utf8, /codepage:utf8 Устанавливает кодировку UTF-8
  • /cp:koi8 Устанавливает кодировку KOI8
/ir Игнорирование переводов строк при поиске. Не работает с Word файлами.
/is Игнорирование пробелов при поиске. Не работает с Word файлами.
/c Если указан, учитывается регистр, если нет – игнорируется.
/l Путь к файлу с результатами замены (поиска), результаты дописываются в конец файла. Если не указан, результаты не фиксируются.
/a Ключ указывает остановить работу в случае возникновения ошибок при работе с файлом, таких как:
  • невозможность произвести чтение файла (например, файл занят другим приложением);
  • невозможность сделать замену, если файл имеет атрибут только-для-чтения;
  • & etc.
Если ключ не указан, утилита пропустит данный файл и продолжит обработку остальных.

Вариант 2: ZennoPoster и FINDSTR
FINDSTR– это команда, которая используется для поиска текста в файлах. Бесспорный плюс – поддержка регулярных выражений, минус – отсутствие функционала «замены», поэтому последнее мы будем делать средствами ZennoPoster. Данное мероприятие лишь облегчит поиск файлов, в которых необходимо произвести замену, да бы не прогонять всё в цикле, чтобы немного ускорит процесс и минимизирует шаблон.

С# кубик:
Код:
var process = new System.Diagnostics.Process {
    StartInfo = new System.Diagnostics.ProcessStartInfo {
     UseShellExecute = false,
     //CreateNoWindow = true,
     RedirectStandardError = true,
     RedirectStandardInput = true,
     RedirectStandardOutput = true,
     FileName = "cmd.exe",
     WorkingDirectory = project.Directory,
     Arguments = @"/c "+project.Variables["command"].Value
     }
};
process.Start();
string output = process.StandardOutput.ReadToEnd();
process.WaitForExit();
process.Close();
process.Dispose();
return output;
У Вас должна быть создана переменная command, где будут храниться параметры.
2016-05-20_16-54-49.png

Итак, рассмотрим несколько примеров.

У нас может быть несколько искомых строк, если команда не имеет параметра /C. Для разделения используется пробел.
Код:
FINDSTR "Жаркое лето" file.txt
Будет искать "Жаркое" или "лето" в файле file.txt

Код:
FINDSTR /C:"Жаркое лето" file.txt
Будет искать "Жаркое лето" в файле file.txt

Код:
findstr /M [0-9] C:\Project\*.*
/M Покажет список файлов, в которых содержится набор цифр от 0 до 9 в директории C:\Project\

Код:
findstr /P /I "Error" C:\Project\*.*
Покажет строки содержащие фразу Error, регистр не учитывается, так же не будут отображаться строки содержащие непечатаемые символы.

Код:
findstr /s /I /O /C:"banned" C:\*.txt
Покажет строки файлов с расширением txt, содержащие слово "banned". Поиск выполняется во всех файлах .txt корневого каталога диска C: и всех его подкаталогов (параметр /S)


А теперь наглядно:
У нас есть директория C:\Test\ в которой лежит 3 текстовых файла.
2016-05-20_16-59-55.png


В одном из них лежит текст-рыба:
Lorem Ipsum - это текст-"рыба", часто используемый в печати и вэб-дизайне. Lorem Ipsum является стандартной "рыбой" для текстов на латинице с начала XVI века. В то время некий безымянный печатник создал большую коллекцию размеров и форм шрифтов, используя Lorem Ipsum для распечатки образцов. Lorem Ipsum не только успешно пережил без заметных изменений пять веков, но и перешагнул в электронный дизайн. Его популяризации в новое время послужили публикация листов Letraset с образцами Lorem Ipsum в 60-х годах и, в более недавнее время, программы электронной вёрстки типа Aldus PageMaker, в шаблонах которых используется Lorem Ipsum.
Давайте попробуем найти все строчки, где встречается выражение «LoremIpsum»:

Код:
findstr /s /I /O /C:"Lorem Ipsum" C:\Test\*.*
Кладем этот скрипт в переменную commandи выполняем наш C# код. Давайте взглянем на ответ:

Код:
C:\Test\123.txt:0:Lorem Ipsum - это текст-"рыба", часто используемый в печати и вэб-дизайне.
C:\Test\123.txt:76:Lorem Ipsum является стандартной "рыбой" для текстов на латинице с начала XVI века.
C:\Test\123.txt:161:В то время некий безымянный печатник создал большую коллекцию размеров и форм шрифтов, используя Lorem Ipsum для распечатки образцов.
C:\Test\123.txt:296:Lorem Ipsum не только успешно пережил без заметных изменений пять веков, но и перешагнул в электронный дизайн.
C:\Test\123.txt:408:Его популяризации в новое время послужили публикация листов Letraset с образцами Lorem Ipsum в 60-х годах и, в более недавнее время, программы электронной вёрстки типа Aldus PageMaker, в шаблонах которых используется Lorem Ipsum.
Формат ответа:
  • Путь к файлу, в котором найдена строка
  • Номер строки
  • Сам текст этой строки
Очень удобно. Теперь мы можем обработать эти данные регулярным выражением и получить путь к файлу, где есть нужные нам данные и номера строк :bx:

Больше информации Вы можете получить по ключу: /?
 

Вложения

Последнее редактирование:

execut0r

Client
Регистрация
12.03.2014
Сообщения
263
Благодарностей
271
Баллы
63
Отличная статья!
 
  • Спасибо
Реакции: ibred

seoBB

Client
Регистрация
07.09.2010
Сообщения
130
Благодарностей
20
Баллы
18
Good
 
  • Спасибо
Реакции: ibred

Jerard

Client
Регистрация
11.04.2013
Сообщения
506
Благодарностей
225
Баллы
43
Для последующей загрузки (например, на FTP)
Кто для загрузки на FTP использует .7z формат?
Там надо использовать .tar.gz или на крайний .zip
Если пишешь про то чтоб запаковать и загружать на FTP, то говори и как его там распаковать.
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 553
Баллы
113
Отличная статья!
Благодарю!

Кто для загрузки на FTP использует .7z формат?
Там надо использовать .tar.gz или на крайний .zip
Архив создается не только в 7z формате:
-t устанавливает формат архива на выходе
Например, -t7z выдаст 7zархив (используется по умолчанию).
Также доступны и другие форматы: zip, tar, gzip, wim, xz и bzip2.
Если пишешь про то чтоб запаковать и загружать на FTP, то говори и как его там распаковать.
Хорошо, дополню статью. Спасибо за комментарий :-)
 

Jerard

Client
Регистрация
11.04.2013
Сообщения
506
Благодарностей
225
Баллы
43
Вопрос по поводу @TextReplacer
Необходимо текст в формате /123/ заменит на текст /123/456/
C# не катит (не делает замену), подписка там есть, софт активирован

Пробовал так:
/findtext /123/ /replacetext /123/456/ /cp:utf8 /d D:\test\
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 553
Баллы
113
Вопрос по поводу @TextReplacer
Необходимо текст в формате /123/ заменит на текст /123/456/
C# не катит (не делает замену), подписка там есть, софт активирован

Пробовал так:
/findtext /123/ /replacetext /123/456/ /cp:utf8 /d D:\test\
К сожалению, /findtext он же /t:
Текст для однострочного поиска без пробелов и (/).
Для задания произвольного текста воспользуйтесь аргументом /tf он же /findtextf.
Путь к файлу с текстом для поиска, используется, если не указан /findtext. Файл может быть документом Word, либо текстовым в кодировке ANSI. Если имя файла содержит пробелы или запятые, его необходимо заключить в кавычки. Для документов Word размер текста не должен превышать 255 символов.
 

Jerard

Client
Регистрация
11.04.2013
Сообщения
506
Благодарностей
225
Баллы
43
Удалось добиться результата через cmd такой командой:
tr /findtextf text1.txt /replacetextf text2.txt cp:utf8 /folder D:\test\ /recursive
Где text1.txt содержал /123/, а text2.txt содержал /123/456/
Но в ZP не пашет, пробовал убирать tr в начале, не вышло.
 
Последнее редактирование:

maestro202

Client
Регистрация
08.05.2016
Сообщения
79
Благодарностей
31
Баллы
18
Спасибо за описание пакетной архивации файлов. Очень нужная вещь!
 

eleeet

Client
Регистрация
08.06.2016
Сообщения
13
Благодарностей
0
Баллы
1
А как быстрее через Си архивировать или через запуск процесса. И какова нагрузка в обоих случаях? Какой подход менее ресурсоемкий?
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 443
Благодарностей
5 459
Баллы
113
Стоит заметить если в пути есть пробелы, то архивирует не корректно.
 
Последнее редактирование:

GREXA

Client
Регистрация
16.09.2017
Сообщения
276
Благодарностей
103
Баллы
43
не могу понять как с переменной туда переместить что нибудь
 

ZSHab

Client
Регистрация
29.10.2014
Сообщения
220
Благодарностей
22
Баллы
18
Вариант 2: ZennoPoster и FINDSTR
Здравствуйте, пытаюсь искать через регулярки в файлах.
findstr /R /C:"Lorem Ipsum" C:\Test\*.*
Но файлы, которые в этой папке, не находит(
В чём может быть причина?
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 553
Баллы
113
Здравствуйте, пытаюсь искать через регулярки в файлах.
findstr /R /C:"Lorem Ipsum" C:\Test\*.*
Если хотите искать по регуляркам, нужно убрать параметр /C:
Код:
findstr /R "Lorem Ipsum" C:\Test\*.*
 
  • Спасибо
Реакции: ZSHab

ZSHab

Client
Регистрация
29.10.2014
Сообщения
220
Благодарностей
22
Баллы
18
Если хотите искать по регуляркам, нужно убрать параметр /C:
Код:
findstr /R "Lorem Ipsum" C:\Test\*.*
Спасибо, получилось
А если нужно именно регуляркой искать кирилицу?
К примеру вот такой: ^[^А-ЯЁA-Z]
findstr /R "^[^А-ЯЁA-Z]" C:\Test\*.*
В Notepad++, находит по ней, в файле limits.
Во вложениях, папка, на которой проверяю.
 

Вложения

  • 26,6 КБ Просмотры: 175
Последнее редактирование:

ZSHab

Client
Регистрация
29.10.2014
Сообщения
220
Благодарностей
22
Баллы
18

Fedman09

Client
Регистрация
25.02.2020
Сообщения
95
Благодарностей
40
Баллы
28
Здравствуйте. У меня такие настройки, как на скрине. Задача - архивировать все, что в папке "2". Но ничего не архивируется. Что я делаю не верно?
 

Вложения

Ttangasan

Новичок
Регистрация
09.08.2021
Сообщения
8
Благодарностей
0
Баллы
1
Здравствуйте. У меня такие настройки, как на скрине. Задача - архивировать все, что в папке "2". Но ничего не архивируется. Что я делаю не верно?
Вроде бы всё верно, фиг знает...
 

Fedman09

Client
Регистрация
25.02.2020
Сообщения
95
Благодарностей
40
Баллы
28

Axel

Client
Регистрация
20.03.2017
Сообщения
123
Благодарностей
6
Баллы
18
Подскажите, работает проект по расписанию, архивирует файлы материалам первого поста, все замечательно.
Но постоянно мелькает окно архиватора на мониторе. Можно ли настроить чтобы все работало в фоновом режиме? Чтобы запуск архиватора не перехватывал курсор и клавиатуру?
 

ZSHab

Client
Регистрация
29.10.2014
Сообщения
220
Благодарностей
22
Баллы
18
Подскажите, работает проект по расписанию, архивирует файлы материалам первого поста, все замечательно.
Но постоянно мелькает окно архиватора на мониторе. Можно ли настроить чтобы все работало в фоновом режиме? Чтобы запуск архиватора не перехватывал курсор и клавиатуру?
Использовал экшен "запуск приложения (bat файла с командой архивации)", а в экшене включал чекбокс "не показывать процесс выполнения"
 
  • Спасибо
Реакции: Axel

Axel

Client
Регистрация
20.03.2017
Сообщения
123
Благодарностей
6
Баллы
18
> "не показывать процесс выполнения"
наверное "не показывать окно процесса", в текущей версии. Работает, спасибо!
 

ZSHab

Client
Регистрация
29.10.2014
Сообщения
220
Благодарностей
22
Баллы
18
> "не показывать процесс выполнения"
наверное "не показывать окно процесса", в текущей версии. Работает, спасибо!
Возможно, писал по памяти)
Рад помочь!
 

Axel

Client
Регистрация
20.03.2017
Сообщения
123
Благодарностей
6
Баллы
18
Добрый день снова,

подскажите, бьюсь целый день не могу понять почему не работает,

как содержимое папки целиком
d:\work\07 04 2023\1\
упаковать в .zip и положить архив 1.zip в папку

d:\home\

Как прописать это в запуске?
a d:\home\1.zip d:\work\07 04 2023\1\

не работает. Другие варианты перепробовал - не работает.
Что не так делаю? Прописываю полный путь где лежит папка, и полный путь куда ее надо запаковать.
 

dukeell

Client
Регистрация
18.09.2021
Сообщения
5
Благодарностей
11
Баллы
3
как содержимое папки целиком
d:\work\07 04 2023\1\
упаковать в .zip и положить архив 1.zip в папку
a -tzip d:\home\название_архива.zip "d:\work\07 04 2023\1\"
Если в названии архивируемой папки пробелы или кириллица без ковычек не работает
 
  • Спасибо
Реакции: Axel

seowin

Client
Регистрация
02.05.2016
Сообщения
116
Благодарностей
9
Баллы
18
Подскажите, а если в названиях файлов кириллица, то можно как-то работать со вторым вариантом?
Сейчас он работает, но выводит названия файлов не верно.

И также интересует вопрос, можно ли искать текст написанный на кириллице?
 
Последнее редактирование:

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 564
Благодарностей
9 179
Баллы
113
Подскажите, а если в названиях файлов кириллица, то можно как-то работать со вторым вариантом?
Сейчас он работает, но выводит названия файлов не верно.

И также интересует вопрос, можно ли искать текст написанный на кириллице?
Полный путь до файла пробовали заключать в кавычки "" ?
 

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)