Добрый день.
Театр начинается с вешалки, а разработка приложений – с подготовки текстовых файлов. Мы пишем код, задаем конфигурационные данные, анализируем результаты. Спрос рождает предложение, и потому инструментов для работы с файлами существует великое множество: от специализированных средств разработки и текстовых редакторов до языков программирования и компактных утилит. Рассмотрим такую задачу: рекурсивно пройти по файлам заданного каталога и заменить в них все вхождения “ISASaddr” на “WebProxyURL”. Вот пара-тройка вариантов решения:
Однострочник Perl + find:
perl -p -i -e 's/ISASaddr/WebProxyURL/g' `find /home/work/ca/ -name *.cfg`
Или, к примеру, grep + xargs + sed:
cd /home/work/ca;grep -rl ISASaddr . |xargs sed -i -e 's/ISASaddr/WebProxyURL/'
Или PowerShell-цепочка в среде Windows:
get-childitem "d:\work\ca" -recurse | select-string "ISASaddr" -list |% { (get-content $_.Path) |% { $_ -replace "ISASaddr", "WebProxyURL" } | set-content $_.Path }
Чем больше опыта работы в командной строке, тем эффективнее решаются подобные задачи. В то же время, иногда такие решения выглядят как залп пушкой по воробьям: есть маленькие операции, которые хочется провести “в лоб” – просто и быстро. Особенно, если это однократная операция при анализе поведения системы или прототип автотеста. Хочется? Знакомьтесь, Swiss File Knife – швейцарский ножик для работы с файлами. Кросс-платформенный (проверено на SLES 10, Ubuntu 8.10 и Win 2k3). Что он умеет? Для начала вернемся к исходной задаче. Вот как ее можно решить:
sles54:/tmp # ./sfk-linux-lib5.exe replace -pat /ISASaddr/WebProxyURL/ -dir /home/work/ca -file .cfg -yes
А вот еще несколько простых примеров. В заданном каталоге найти три самых больших файла:
sles54:/tmp # ./sfk-linux-lib5.exe list -big=3 -dir /usr/bin
Или два самых свежих:
sles54:/tmp #./sfk-linux-lib5.exe list -late=2 -pure /tmp
Или пять самых старых:
sles54:/tmp # ./sfk-linux-lib5.exe list -old=5 -pure /tmp
Или три самых маленьких:
sles54:/tmp # ./sfk-linux-lib5.exe list -small=2 -pure /tmp
Задачка чуть посложнее: отфильтровать файл, исключив строки, содержащие дату в формате MMM dd HH:mm:ss (Feb 24 04:15:39) и слово reporting:
sles54:/tmp # ./sfk-linux-lib5.exe filter /var/log/shuttle.log "-ls:??? ?? ??:??:?? * reporting"
Рекурсивно пройтись по заданному каталогу и найти файлы с одинаковым содержимым:
sles54:/tmp # ./sfk-linux-lib5.exe dupfind /tmp/dir1
Скопировать все текстовые файлы из каталога /tmp/test1 в каталог /tmp/test2, за исключением файлов-дупликатов:
sles54:/tmp # ./sfk-linux-lib5.exe dupfind -listorg /tmp/test1 .txt +run "cp #file /tmp/test2" -yes
Нравится? “Ножик может, ножик может все что угодно”. Вот неполный список “лезвий”:
* статистика по файлам в разрезе времени, размеров, типов
* эффективный поиск с фильтрацией и заменами “на лету” (как текстовые, так и бинарные файлы)
* “карманные” ftp- и http-серверы, функциональность wget
* разбивка больших файлов на части и склеивание в одно целое
* синхронизация файлов в каталогах
* hex-дампы, исходный код из бинарников, преобразование форматов, работа с md5
И еще множество других отверточек и заточек, которые могут оказаться полезными в повседневной работе. Утилита хорошо документирована, возможен поиск как по командам, так и по ключевым словам. Приятный инструмент, в хозяйстве пригодится.
Оставайтесь с нами и расскажите про швейцарский ножик друзьям. До встречи.
Что такое качество программного обеспечения и как его улучшить: теория и практика, задачи и решения, подводные камни и обходные пути.
Автор комментария : jkeks | July 14, 2010
Да действительно интересная тулза, я ее хочу приспособить для автоправки конфигов Openoffice.
[Ответить]