Как я могу отсортировать список каталогов по алфавиту и получить первое значение, которое сортируется после определенной строки?


Изменение размера поддерживается драйвером терминала, отправляющим процессу сигнал unix SIGWINCH. Это означает ИЗМЕНЕНИЕ РАЗМЕРА ОКНА. Новый размер можно считать с оконечного устройства.

Если вы посмотрите на список сигналов unix, другого такого сигнала для возможностей терминала нет.

Большинство возможностей терминала определяется переменной окружения TERM. Поскольку это переменная среды, TERMне изменяется ни другими процессами, ни ядром...Ядро не пытается выяснить, какой терминал подключен к последовательной линии. Он также не пытается узнать размер терминала; эта функция не реализована в традиционной последовательной линии.

Последовательные линии были разработаны без протокола автоматического -обнаружения. РЕДАКТИРОВАТЬ :абсолютно возможно отключить терминал и подключить другой. Пользователю придется обновить свой TERMвручную (, а также размер терминалаstty rows 24 cols 80). Оболочка или любое другое приложение не обнаружит это автоматически.

AIUI, функция изменения размера не соответствует стандарту POSIX. Соответствующие настройки sttyтакже специально отмечены в man sttyкак нестандартизированные. Однако эти возможности предположительно являются общими для всех современных систем -терминалы с фиксированными символами устарели. Большинство переносимых программ написаны с использованием библиотеки ncurses или аналогичной, поэтому точный сигнал (и ioctl для чтения размера )могут различаться.

4
24.01.2020, 13:17
5 ответов
for dir in ????-??-??--??:??:??/; do
    if [[ $dir > "2020-01-05--00:00:00" ]]; then
        printf '%s\n' "$dir"

        # process "$dir" here

        break
    fi
done

Приведенный выше скрипт будет перебирать каталоги в текущем каталоге, имена которых соответствуют шаблону ????-??-??--??:??:??.

Для каждого каталога сравнивается со строкой 2020-01-05--00:00:00. Если он сортирует после этой строки лексикографически, печатается имя каталога и цикл завершается.

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

Чтобы скопировать этот каталог в другое место, замените комментарий на что-то вроде

rsync -av "$dir" /somewhere/elsewhere

Ниже приведен сценарий, который берет конкретную строку из своего первого аргумента командной строки и делает то же самое:

#!/bin/bash

for dir in ????-??-??--??:??:??/; do
    if [[ $dir > "$1" ]]; then
        printf '%s\n' "$dir"

        # process "$dir" here

        break
    fi
done

Тестирование этого с каталогами, которые вы указали:

$ ls -l
total 10
drwxr-xr-x  2 myself  wheel  512 Jan 24 11:14 2019-12-04--16:12:56
drwxr-xr-x  2 myself  wheel  512 Jan 24 11:14 2019-12-09--13:36:53
drwxr-xr-x  2 myself  wheel  512 Jan 24 11:14 2020-01-23--13:24:13
drwxr-xr-x  2 myself  wheel  512 Jan 24 11:14 2020-01-23--13:47:03
-rw-r--r--  1 myself  wheel  119 Jan 24 11:23 script.sh
$./script.sh "2020-01-05--00:00:00"
2020-01-23--13:24:13/
6
27.01.2020, 20:47

Вы можете попробовать

~$ ls -r | head -n 1
-2
27.01.2020, 20:47

Я придумал

$ printf '%s\n' ????-??-??--??:??:?? | awk '$1 > "2020-01-05--00:00:00"{print;exit}'
2020-01-23--13:24:13
5
27.01.2020, 20:47

Сzsh:

ref=2020-01-05--00:00:00
list=($ref *(DN/oN)) # list is ref + all directories unsorted
list=(${(o)list}) # sort the list (as per locale collation algorithm)
print -r -- ${list[$list[(ie)$ref] + 1]-none}

(где $array[(ie)string]расширяется до массива index элемента, который eточноstring).

2
27.01.2020, 20:47

ls|sort|grep -A 1 2020-01-20|head -n 2|tail -n 1

0
27.01.2020, 20:47

Теги

Похожие вопросы