Закрыто (bash скрипт: цикл по полным именам файлов)
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Закрыто (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 выглядит так (по аналогии делается и обратное преобразование): <?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 => $object)
{
if($object->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 \'<meta http-equiv="Content-Type" content="text/HТМL; charset=UTF-8" />\' \'<meta http-equiv="Content-Type" content="text/HТМL; charset=Windows-1251" />\' -- ' . escapeshellarg($name);
system($syscmd1);
system($syscmd2);
}
}
}
?>
|
|
|
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. =)
|
|
|
|
|