Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Закрыто (bash скрипт: цикл по полным именам файлов)

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Прочее] >> Закрыто (bash скрипт: цикл по полным именам файлов)
Имя
Сообщение << Старые топики   Новые топики >>
Закрыто (bash скрипт: цикл по полным именам файлов) - 2012-01-12 22:12:24.300000   
bob3r

Сообщений: 67
Оценки: 0
Присоединился: 2011-06-03 02:30:17.840000
Всем привет.
Проблема с написанием bash-скрипта, который бы обработал все HТМL файлы в указанном каталоге и подкаталогах. Не могу получить имена всех файлов (тех что подкаталогах)
В windows бы сделал так:
dir /B /S | findstr /R /I ".*.HТМL"
(или даже без регулярного выражения, просто указать, что надо искать в конце строки) + комбинация с FOR.

А как такое же повторить в Linux.
Получить содержимое текущего каталога можно легко: ls
И соотвествующий скрипт, очевидно, такой:
#!/bin/sh
for x in `ls -R `
do
echo $x
done

Но он не возвращает полные имена файлов, а пишет имена каталогов в отдельной строке, а под ней список содержимого.
У кого какие есть идеи? (напишу пока реализацию на питоне)

Конкретная задача -
1. Перекодировать файлы в UTF-8 (для этого думал использовать iconv, передавая полное имя файла в аргументе)
2. Заменить строку <meta http-equiv="Content-Type" content="text/HТМL; charset=windows-1251" /> на строку <meta http-equiv="Content-Type" content="text/HТМL; charset=UTF-8" /> (тут думал использовать replace).

Так или иначе нужен цикл по всем файлам, включая вложенные (а способы реализации могут быть самые разные). Заранее спасибо за помощь.


====================
updаtе
Сделал на PHP, перекодировка из UTF-8 в Windows-1251 выглядит так (по аналогии делается и обратное преобразование):
&lt;?php system("rm -R /media/files/Project/hackradar/currsite/win-1251/"); system("cp -R /media/files/Project/hackradar/currsite/article/ /media/files/Project/hackradar/currsite/win-1251/"); $path = realpath('/media/files/Project/hackradar/currsite/win-1251'); $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)); foreach($objects as $name =&gt; $object) { if($object-&gt;isFile()) { if(preg_match('@\.(HТМL?|css|js|txt)$@i', $name)) { $syscmd1 = 'iconv -f UTF-8 -t WINDOWS-1251 ' . escapeshellarg($name) . ' -o ' . escapeshellarg($name); $syscmd2 = 'replace \'&lt;meta http-equiv="Content-Type" content="text/HТМL; charset=UTF-8" /&gt;\' \'&lt;meta http-equiv="Content-Type" content="text/HТМL; charset=Windows-1251" /&gt;\' -- ' . escapeshellarg($name); system($syscmd1); system($syscmd2); } } } ?&gt;
Post #: 1
RE: Закрыто (bash скрипт: цикл по полным именам файлов) - 2012-01-14 10:17:03.513333   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
for i in `find .`; do # делаем с $i всё что надо; doneПравда такой код будет косячить на именах файлов с пробелами. С этим можно бороться используя опцию -printf у find, и выводить имена файлов в кавычках, но если имя файла содержит кавычку, то опять же косяки пойдут. Самый простой способ справиться со всеми именами файлов – это использовать в find опцию -print0, перенаправлять вывод в xargs, а обработку файла сложить в исполняемый файл. То есть, по-порядку:
1. Создаётся скрипт recode.sh, который обрабатывает один файл – перекодирует, чё-то там удаляет, что-до добавляет;
2. find . -print0 | xargs -0 ./recode.sh

Возможно, создавать отдельный файл скрипта не обязательно, и можно обойтись объявлением функции bash, но я не уверен, что это сработает. По идее должны, но всё же я не уверен, никогда не интересовался, поскольку у меня имена файлов не содержат никаких специальных символов bash. =)
Post #: 2
Страниц:  [1]
Все форумы >> [Прочее] >> Закрыто (bash скрипт: цикл по полным именам файлов)







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.