ls -ltr с использованием PHP exec () - PullRequest
0 голосов
/ 01 июля 2010

как говорит проблема когда я делаю

exec("ls -ltr  > output.txt 2>&1",$result,$status);

отличается от нормального выхода. Добавляется дополнительный столбец. что-то вроде

-rw-r--r-- 1 apache   apache    211 Jul  1 15:52 withoutsudo.txt
-rw-r--r-- 1 apache   apache      0 Jul  1 15:53 withsudo.txt

где, когда выполняется из командной строки, это похоже на

-rw-r--r-- 1 apache   apache    211 2010-07-01 15:52 withoutsudo.txt
-rw-r--r-- 1 apache   apache    274 2010-07-01 15:53 withsudo.txt
-rw-r--r-- 1 apache   apache    346 2010-07-01 15:55 sudominusu.txt
-rw-r--r-- 1 apache   apache    414 2010-07-01 15:58 sudominusu.txt

Посмотри на разницу. Итак, в первом выводе мой обычный awk '{print $ 8}' завершается неудачно. Я столкнулся с той же проблемой с Cron. Но решил это, позвонив

./$HOME/.bashrc

в сценарии. Но не происходит с помощью PHP. Если как-то я могу «сказать» php «exec» из обычной среды. Любая помощь будет оценена.

Ответы [ 4 ]

2 голосов
/ 01 июля 2010

В вашей оболочке входа в систему, ls, вероятно, имеет псевдоним, чтобы печатать другую дату.Это должно быть в вашем файле .basrc или .bash_profile.

Явно передайте опцию --time-style= в ls, чтобы убедиться, что она печатает дату в ожидаемом формате при использовании PHP.

1 голос
/ 01 июля 2010

Полагаю, вас интересуют только имена файлов, и вы хотите отсортировать их по времени.Попробуйте это:

ls -tr1> output.txt 2> & 1

Вы получите список только с именами файлов, поэтому вам вообще не нужен awk.

Другое решение - указать формат времени с помощью "--time-style iso".Посмотрите справочную страницу

1 голос
/ 01 июля 2010

Это не лишний вывод, это разница в форматировании даты.Очевидно, у вас есть другой языковой стандарт, установленный в PHP и в bash («командная строка»).

(в bash выполнение export LANG=C или export LANG=en_US дает результат с трехбуквенным названием месяца)

0 голосов
/ 01 июля 2010

Выход ls сильно зависит от окружающей среды (например, LANG является важной переменной здесь).Почему бы не использовать комбинацию scandir, stat и krsort?

function ls($dir_name) {
  $finfo = array();
  foreach (scandir($dir_name) as $file_name) {
    $s = stat(join('/', array($dir_name,$file_name)));
    $finfo[$file_name] = $s['mtime'];
  }
  krsort($finfo);
  return array_keys($finfo);
}

Это будет безопаснееи намного эффективнее, чем обстреливать ls.Не говоря уже о том, что вы получаете возможность настраивать сортировку и фильтровать результаты способами, которые трудно сделать внутри exec.

КСТАТИ: Яэто не значит, эксперт по PHP, поэтому приведенный выше фрагмент кода может быть невероятно небезопасным и полным ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...