Hello stackpeople!
Мне нужно решить 2 задачи и отобразить результаты в онлайн-формате в виде cgi-файла.
A) получить все имена папок по заданному пути
B) определить возраст index.html внутри каждой папки
результат должен выглядеть следующим образом:
[Номер] [Имя папки] [файл]
Эта cgi-страница работает на сервере Solaris с установленным perl 5.8.4
Мое решение - комбинация bash и perl. Чтобы решить проблему A) (имена папок), я написал сценарий bash:
#!/bin/bash
#
find /test/ -type d | sed -e 's/^.*\///'
Это дает мне хороший список всех имен папок в / test /
Теперь код perl для отображения этого вывода в браузере:
#Establish a pipeline between the bash and my script.
my $bash_command = '/test./foldernames.bash';
open(my $pipe, '-|', $bash_command) or die "Can't open pipe: $!";
# initialize variables
my $foldername = "";
my $i = 0;
# Process the output from bash command line by line.
while (my $line = <$pipe>)
{
$foldername = $line;
$i = $i+1;
print" <tr><td>$i</td><td>$foldername</td></tr>";
}#end while
Это работает! Я получу хороший стол с [Number] и [Foldername]! А теперь самое сложное! Кроме того, мне нужна дата index.html, расположенная в каждой папке. Поэтому у меня есть другой сценарий bash:
ls -ltr /test/folder1/*.html | tail -1 | awk '{printf"%3s %1s %s\n",$6, $7, $8}`
Это дает мне идеальный результат: 22 февраля, 10:56 Теперь мне нужна эта информация в моей таблице. Я добавил эту строку в свой сценарий Perl в цикле while:
$timestamp = `ls -ltr /test/folder1/*.html | tail -1 | awk '{printf"%3s %1s %s\\n",\$6, \$7, \$8}`;
Это отлично работает, когда я добавляю имя папки в виде строки. Как только я обменяю folder1 на $ foldername , я получаю бессмысленную информацию «ls».
Почему это так?
Редактировать: Теперь я использовал:
use File::stat;
use Time::localtime;
my $timestamp = ctime(stat("/test/folder1")->mtime);
Это более безопасно по сравнению с синтаксическим анализом вывода ls. Но у меня все еще есть проблемы с именем $foldername. Я использовал функцию length , чтобы определить длину $ Foldername .
$ foldername имеет длину 7, но вывод строки содержит только 6 символов: помидор
Итак, я пробовал Нарезать / пережевывать имя $ foldername с всегда одним и тем же результатом: 7 символов!