как проблема заявляет .. когда я делаю
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, поэтому приведенный выше фрагмент, вероятно, будет невероятно опасным и полным ошибок.