Ренеймер убрать пробелы из файлов

mikestat

На сервере в интернете лежат файлы. Есть какой-нить простенький пхп скрипт который поможет переименовать все пробелы скажем в символ "_". Как это сделать?

ppplva

perl -pi -e 's/ /_/g' * 
кажется, так
На php сам перепишешь.

mikestat

эээ... а как бы все это теперь реализовать чтобы все мои файлы переименовать. Я просто не очень шарю в перл. Какая последовательность действий?

ppplva

Блин, дошло. Переименовать.
#!/usr/bin/perl
foreach $a (`ls`) {
chomp $a;
($b = $a) =~ s/ /_/g;
rename $a, $b;
}

mikestat

Это просто выложить на сервак файл пхп с таким кодом и запустить его через броузер?

ppplva

Попробуй
Главное, в нужную директорию клади, или путь во второй строке поменяй.

mikestat

Блин.. не пашет... Подскажи поподробней на какой путь нужно изменить? на полный путь? всместо чего в твоем скрипте?

mikestat

Вот скрипт который переделывает из большого регистра всех файлов в маленький:
Может ктонить его переделать чтобы он вместо пробелов делал символ _
     <?php

/* Scan root directory */
/* ******************* */

if(!isset($dir_arr) && isset($root
{
$main_dir = stripslashes($root);

if(!($handle=@opendir($main_dir
{
print "<DIV align=center><h5>PLEASE SPECIFY A VALID DIRECTORY</h5></div>";
exit;
}
$i=1;
$dir_arr=array;
echo "THE FOLLOWING FILENAMES WERE CONVERTED TO LOWERCASE<br>";
echo "********************************<br>".$main_dir."<br>********************************<br>";
while ($file = readdir($handle
{
if ($file != "." && $file != "..")
{
/* Check if the file is a directory and if so, store it in an array */
/* **************************************************************** */

if(is_dir($main_dir."\\".$file
{
array_push($dir_arr,$file);
}
echo "$i=>\"$file\",<br>";
$file2 = strtolower($file);
if(!(@rename($main_dir."\\".$file,$main_dir."\\".$file2
{
Print "<br>Rename Failed<br>";
}
$i++;
}
}
closedir($handle);
}

/* Traverse through the subfolders stored in the array */
/* **************************************************** */

$x=0;
while($x<count($dir_arr
{
$main_dir = addslashes(stripslashes($root)."\\".$dir_arr[$x]);
if(!($handle=@opendir($main_dir
{
print "<DIV align=center><h5>CANNOT OPEN DIRECTORY</h5></div>";
exit;
}
$i=1;
echo "********************************<br>".stripslashes($main_dir)."<br>********************************<br>";
while ($file = readdir($handle
{
if ($file != "." && $file != "..")
{
if(is_dir($main_dir."\\".$file
{
$dir_arr[]=$dir_arr[$x]."\\".$file;
}
echo "$i=>\"$file\",<br>";
$file2 = strtolower($file);
if(!(@rename($main_dir."\\".$file,$main_dir."\\".$file2
{
Print "<br>Rename Failed<br>";
}
$i++;
}
}
closedir($handle);
$x++;
}
?>

rosali

perl -pi -e 's/ /_/g' *
Ну ты заебись человеку посоветовал!
ему файлы переименовать надо, а ты в _содержимом_ файлов все пробелы херачишь, хорошо хоть он не понял как запустить...

Vladislav177Rus

Судя по всему, достаточно все строки $file2 = strtolower($file); заменить на $file2 = str_replace(" ", "_", $file);

ppplva

это был бы ахтунг
странное выражение "переименовать все пробелы" напомнило мне "заменить все пробелы", а не "переименовать все файлы"

mikestat

не не пашет

Vladislav177Rus

Если бы не надо было проводить рекурсивный поиск по каталогам, я бы написал так:
foreach (glob("* *") as $filename) {
rename($filename, str_replace(" ", "_", $filename;
}
Но, наверно, это не очень большая проблема, привинтить сюда поиск директорий и рекурсивный вход в них?

rosali

У тебя вообще какой доступ на сервер, что консоли нет?

mikestat

На сервер только ФТП доступ...

sergey_m

> У тебя вообще какой доступ на сервер, что консоли нет?
Консоль - это когда к последовательному порту подключают терминал. А ты хотел сказать слово шелл.
См. также R.O.C. FAQ, Q40.

mikestat

А код полностью можно?

mikestat

Ну чо никто помочь не хочет? Программеры блин...

Elina74

rename.pl
 #!/usr/bin/perl -w
use strict;
my ($path, @tmp_files, $i, $new_name, $filenum, $old_name);
$path = ".\\";
opendir(DIR, $path) || die "cannot open dir";
@tmp_files = readdir(DIR);
closedir(DIR) || die "cannot close";
$filenum=@tmp_files;
$i=0;

for($i=0; $i<$filenum; $i++){
if( $tmp_files[$i] =~ / / ){
$old_name = $tmp_files[$i];
$new_name = $old_name;
$new_name =~ s/ /_/g;
print($new_name, "\n");
rename($old_name, $new_name);
}
}

Запускать так:
perl rename.pl
Переименует все файлы в текущей директории в имени которых есть пробел.

Marinavo_0507

чё так сложно, вон выше из двух строчек скрипт то же самое делает

Elina74

Каюсь... невем, что есть glob. Это какая-то линуховая фишка?

ruler

Perl. There's more than one way to do it

Marinavo_0507

Perl/Win32. There's more than one way to do it, and it's a good thing, because most of the ways don't work.

Vladislav177Rus

glob
(PHP 4 >= 4.3.0)
glob -- Find pathnames matching a pattern
Description
array glob ( string pattern [, int flags])
The glob function searches for all the pathnames matching pattern according to the rules used by the shell. No tilde expansion or parameter substitution is done.
Returns an array containing the matched files/directories or FALSE on error

mikestat

А куда этот файл положить? в папку cgi-bin и рядом с ней все файлы которые нужно заменить? Потому что не пашет если я положу в папку где сейчас лежат файлы.

Elina74

положи в папку cgi-bin
укажи в переменной $path путь к папке, где лежат файлы, имена которых надо изменить
вызови скрипт из броузера "что-то-там/cgi-bin/rename.pl"

mikestat

СпасибО! 5 звезд тебе

mikestat

А какие права на файл выставить?

sergey_m

> Каюсь... невем, что есть glob. Это какая-то линуховая фишка?
man perlfunc
/glob

Elina74

Такие, чтоб его можно было выполнить - для скрипта.
Такие, чтоб их можно было читать, изменять - для переименуемых файлов.

ppplva

Такие, чтоб их можно было читать, изменять - для переименуемых файлов.
Достаточно +rx на директорию.

mikestat

Нифига не пашет - http://www.replays.ru/cgi-bin/rename.pl
Внутри скрипта:
#!/usr/bin/perl 


use strict;
my ($path, @tmp_files, $i, $new_name, $filenum, $old_name);
$path = "/home/d/designsdm/replays_ru/public_html/test";
opendir(DIR, $path) || die "cannot open dir";
@tmp_files = readdir(DIR);
closedir(DIR) || die "cannot close";
$filenum=@tmp_files;
$i=0;

for($i=0; $i<$filenum; $i++){
if( $tmp_files[$i] =~ / / ){
$old_name = $tmp_files[$i];
$new_name = $old_name;
$new_name =~ s/ /_/g;
print($new_name, "\n");
rename($old_name, $new_name);
}
}

Права на всех файлах и директориях 777

spirinale

ls -1a /home/d/designsdm/replays_ru/public_html/test | awk 'BEGIN{path="/home/d/designsdm/replays_ru/public_html/test/"} {old = $0; gsub(/[ ]/, "_"); system("mv \"" path old "\" \"" path $0 "\"")}'
это если не надо директорию test проходить рекурсивно, если нужно - напиши

rosali

На сервер только ФТП доступ...
Какие нафиг ls | awk
Или я чего-то не того?

mikestat

Блин. А реально это переделать например скрипт Лориена чтобы он выдавал список всех файлов на сервере. Без индексирования. Просто поиск в определенной директории файлов и затем вывод в виде поиска. Так можно? У него вроде там решена проблема с пробелами в файле...

spirinale

типа cgi скрипт - какая разница перл там будет или что другое?

spirinale

если честно, я не знаю какой у Лориена скрипт
если я правильно понял вопрос (возможен ли рекурсивный поиск в директории по названию файла? то - можно
надо только задачу точнее поставить
только я не понял: какие проблемы влекут пробелы в названиях файлов?

Elina74

Ты дебагом умеешь заниматься? Как именно не пашет? На какой строке происходит ошибка? Смотри логи, если доступны.

mikestat

Permission denied написано

Elina74

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

mikestat

Короче проблема в ебучем хостнге. Ох уж сколько я время на это потратил. Вдруг решил попробовать запустить скрипт на мастерхосте и все заработало, а spaceweb.ru полная лажа!
Кто может переписать этот скрипт в php ? Походу там у них глубокие проблемы с перлом
Оставить комментарий
Имя или ник:
Комментарий: