ls -ltr с помощью PHP exec ()

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

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» из обычной среды. Любая помощь будет оценена по достоинству.

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

ls -tr1> output.txt 2> & 1

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

Другое решение – указать формат времени с «iso-style-iso». Посмотрите на страницу руководства

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

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

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

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

Выход 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); } 

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

BTW: Я никоим образом не специалист по PHP, поэтому приведенный выше фрагмент, вероятно, будет невероятно опасным и полным ошибок.