Сортировка файлов по времени модификации

8

Я видел много вопросов и ответов здесь, используя конструкцию в соответствии с

list_dir=`ls -t /path/to/dir/`
for i in $list_dir; do

или

ls -t | while read i; do

Теперь я знаю, что вы не должны использовать ls в скриптах, потому что они легко ломаются; но я не могу найти лучший способ работы с файлами в порядке от последнего изменения до последнего изменения (или наоборот).

Я могу использовать что-то вроде:

find . -type f -printf '%T@ %p\n' | sort -n | cut -d ' ' -f 2- | while read i; do...

... но это все равно не работает с любыми файлами, в именах которых есть переводы строк, и загружать их гораздо труднее. Есть ли способ лучше?

evilsoup
источник

Ответы:

8

«Не используйте ls в скриптах» - проблема с POSIX ls «только»; см --quoting-style=. GNU .

Сортировка GNU решает проблему с --zero-terminated.

Если это должно быть совместимо, то вы можете использовать find ... -execдля передачи одного имени файла за раз в сценарий, который выполняет экранирование. Если доступен хотя бы bash:

start cmd:> testfunc () { echo "${1//$'\n'/\n}"; }
start cmd:> testfunc a$'\n'b
a\nb
Хауке Лагинг
источник
Ах, --zero-terminatedспасибо за это, я бы хотел дать вам еще больше очков!
evilsoup
... ОК, я немного смущен тем, что info ls: если мне нужен пуленепробиваемый скрипт с ls, что --quoting-styleмне использовать?
evilsoup
@evilsoup Я думаю, что --quoting-style=escapeэто выбор.
Хауке Лагинг
Теперь, чтобы создать несколько файлов с символами новой строки в их именах, чтобы проверить это: P
evilsoup
1
Также: я сталкиваюсь с крайним случаем, когда когда-либо происходит ls --quoting-styleсбой GNU (для синтаксического анализа), потому что он цитирует только имена файлов: когда у вас есть пробел в имени группы. Хорошо, это очень странный случай, но он добавлен в оболочку Cygwin Bash, здесь у вас есть такие имена групп, как Domain Users.
DavAlPi
4

Самый простой способ - использовать zsh. Глоб классификатор om сортирует матчи в обратном хронологическом порядке; использовать Omв хронологическом порядке.

for x in /path/to/dir/*(Nom); do …

Спецификатор Nglob заставляет шаблон расширяться до пустого списка, если каталог пуст. Сделайте это, *(DNom)чтобы соответствовать точечные файлы.

Жиль "ТАК - перестань быть злым"
источник
1
Черт, это первый раз, когда у меня возникает соблазн смотреть на другие оболочки - это очень приятно.
evilsoup