Поиск файлов с последней датой, имеющей несколько шаблонов

Наконец-то ясно, что xdg-openне работает. Это было рассмотрено в

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=908760#20

0
30.09.2021, 11:22
2 ответа

С стат в Linux вы можете сделать:

find... -exec stat -f "%Y %N" {} + |sort -rn|head -1|cut -f2

В macOS stat аргументы определяются по-другому, и это становится:

find... -exec stat -f "%m%t%N" {} + |sort -rn|head -1|cut -f2

Идея состоит в том, чтобы вернуть список имен файлов с временем их последней модификации в секундах Эпохи; отсортируйте список по убыванию времени и вырежьте из списка имя самого последнего измененного объекта.

В обоих случаях имена файлов со встроенными пробелами обрабатываются с помощью разделителя табуляции между секундами Эпохи и именем файла.

0
30.09.2021, 13:25

Используя оболочку zsh, вы сможете создать короткий шаблон оболочки (-ish ), чтобы найти последний измененный обычный файл в папке /path, имя которого соответствует шаблонуREF_DATA*:

/path/**/REF_DATA*(.NDom[1])

В этом шаблоне подстановки оболочки **соответствует подкаталогам на любом уровне. Скобка в конце — это квалификатор подстановки, который изменяет поведение предыдущего шаблона подстановки. В этом случае точка означает, что он соответствует только обычным файлам, то есть не каталогам или другим типам файлов. Nи Dимеют тот же эффект, что и включение параметров оболочки nullglobи dotglobв оболочке bash; он удаляет шаблон, если он ничему не соответствует, и делает шаблон соответствующим скрытым именам.

Окончательные omи [1]упорядочивают файлы по метке времени модификации -и возвращают первую запись из упорядоченного набора, т. е. последний измененный файл.

Если вы хотите, чтобы последний измененный файл соответствовал либо REF_DATA*, либо REF_CUST*, используйте

/path/**/REF_(DATA|CUST)*(.NDom[1])

Таким образом, вы могли бы, например, использовать этот шаблон с некоторой полезностью, как в

printf '%s\n' /path/**/REF_(DATA|CUST)*(.NDom[1])

Чтобы получить только компонент имени файла пути, добавьте :tв конец квалификатора подстановки.

Из оболочки, отличной от -zsh, вы, вероятно, вызовете это, используя

zsh -c 'printf "%s\n" /path/**/REF_(DATA|CUST)*(.NDom[1]:t)'

Или, чтобы получить два файла, соответствующие любому шаблону, соответственно, в массив в bash(, если существуют два файла, в противном случае вы получите одну или ноль записей в вашем массиве ),

array=(
    "$( zsh -c 'printf "%s\n" /path/**/REF_DATA*(.NDom[1]:t)' )"
    "$( zsh -c 'printf "%s\n" /path/**/REF_CUST*(.NDom[1]:t)' )"
)

Обратите внимание, что это, скорее всего, удалит завершающую новую строку из имен файлов, если такая новая строка существует там (, что было бы необычно, но технически возможно ).

Если вы пишете в zshдля начала,вы, очевидно, не стали бы звонить zsh -c, а вместо этого напрямую

array=(
    /path/**/REF_DATA*(.NDom[1]:t)
    /path/**/REF_CUST*(.NDom[1]:t)
)
2
30.09.2021, 14:03

Теги

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