Начиная с zsh 4.3.9dev2, существует специальный классификатор для пользовательской сортировки:
oe
и o+
являются особыми случаями;за каждым из них следует шелл-код, разделенный как для квалификатора glob e
и квалификатора glob +
соответственно (см. выше).Код выполняется для каждого сопоставленного файла с параметром REPLY
, установленным на имя файла в записи, и globsort
, добавленным к zsh_eval_context
.Код должен каким-то образом изменить параметр REPLY
.По возвращении значение параметра используется вместо имени файла в качестве строки для сортировки.
Вы можете использовать этот классификатор для построения списка имен файлов.Вот базовая версия, которая сортируется по полному содержанию строки:
for file in *(oe\''REPLY=$({ read -r REPLY && IFS= read -r REPLY; } <$REPLY)'\'); do …
Если ваша дата состоит только из части строки или имеет какой-то странный формат, проанализируйте ее.Например, если у вас есть дата в европейском стиле (день / месяц / год):
for file in *(oe\''REPLY=$({ read -r REPLY && IFS=/ read -r d m y &&
REPLY=$((y*10000+m*100+d)); } <$REPLY)'\'); do …
В любой оболочке вы можете создать список имен с добавленной датой, отсортировать этот список, а затем вырезатьвне даты.Я предполагаю, что ни одно из имен файлов не содержит символа новой строки, и ни одна из дат не содержит символов |
.
names=
IFS='
'
for file in *; do
{ read -r line; read -r line; } <"$file"
# If needed, process $line into something that is to be sorted lexicographically.
names="$names
$line|$file"
done
names=$(echo "$names" | sort)
set -f
for file in $names; do
set +f
file=${file#*|}
…
done