Разбор вывода ls
для перебора списка файлов bad. Итак, как мне нужно перебирать список файлов, чтобы они были сначала созданы? Я просмотрел несколько вопросов здесь на SO, и все они, похоже, разбираются ls
.
Вложенная ссылка предлагает:
Все становится сложнее, если вам нужна определенная сортировка, которая только
ls
может выполнять, например, упорядочивание наmtime
. Если вы хотите, чтобы новый файл в каталоге, не используйтеls -t | head -1
- читайте Bash FAQ 99 вместо этого. Если вам действительно нужен список всех файлов в каталоге в порядке mtime, чтобы вы могли обрабатывать их последовательно, переключитесь на perl, и ваша программа perl сделает свое открытие каталога и сортировка. Затем выполните обработку в программе perl, или - в худшем случае сценарий - программа perl выплевывает имена файлов с помощью NUL разделители.Еще лучше, укажите время модификации в имени файла, в YYYYMMDD формат, так что порядок glob также является mtime-порядком. Тогда вам не нужны ls или perl или что угодно. (Подавляющее большинство случаев, когда люди хотят старейший или новейший файл в каталоге можно решить, просто выполняя это.)
Означает ли это, что существует нет собственный способ сделать это в bash
? У меня нет права изменять имя файла, чтобы включить в него время. Мне нужно запланировать script в cron
, который будет запускаться каждые 5 минут, генерировать массив, содержащий все файлы в определенном каталоге, упорядоченные по времени их создания, и выполнять некоторые действия над именами файлов и перемещать их в другое место.
Следующие работали, но только потому, что у меня нет забавных имен файлов. Файлы создаются сервером, поэтому у него никогда не будет специальных символов, пробелов, строк перевода и т.д.
files=( $(ls -1tr) )
Я могу написать perl
script, который будет делать то, что мне нужно, но я был бы признателен, если кто-то может предложить правильный способ сделать это в bash
. Портативный вариант был бы замечательным, но решение с использованием последних утилит GNU тоже не будет проблемой.