Скрипт для поиска самых новых файлов из списка

Depende de la disponibilidad de los expedientes y del orden de su ejecución. Cada vez que abre un nuevo shell, se lee el archivo ~/.bashrc. El archivo ~/.profile solo se lee cuando el usuario inicia sesión, pero no cuando el usuario inicia un nuevo shell. Entonces, ya sea que establezca la ruta en el archivo ~/.bashrc o en el archivo ~/.profile, no habrá mucha diferencia. Una buena práctica es configurarlo en el archivo ~/.bashrc. Además, el archivo ~/.profile se lee solo cuando el inicio de sesión ~/.bash _o los archivos de perfil ~/.bash _no están disponibles.

-7
04.05.2017, 12:40
1 ответ

С инструментами GNU:

#! /bin/bash -
export LC_ALL=C
eval "files=($(ls -dt --quoting-style=shell-always -- "${@?}"))"
((${#files[@]} > 0)) && printf '%s\n' "${files[0]}"

Для символических ссылок будет учитываться время последней модификации самой символической ссылки. Если вы предпочитаете, чтобы это была цель символической ссылки, добавьте параметр -L к ls.

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

#! /bin/sh -
# only works for file paths that don't contain newline characters
[ "$#" -gt 0 ] && ls -td -- "$@" | head -n 1

и удалить зависимость от инструментов GNU.

Принцип тот же: используйте способность ls -t сортировать файлы по времени модификации и получить первый в этом списке. Но здесь ls выводит список файлов по одному в каждой строке, что делает невозможным надежный анализ, если вы не можете гарантировать, что ни один из путей к файлам не будет содержать символы новой строки (в противном случае вы не сможете укажите разницу между файлом с именем ab и двумя файлами a и b и если ab был самый новый файл, head -n 1 будет отображать только a, что даст неверный результат).

По сравнению с вашим подходом здесь мы передаем список аргументов, полученных сценарием ("$@"), в ls (после -- , чтобы эти аргументы обрабатывались ls как файловые операнды, а не параметры) и передавая -d, чтобы ls не перечислял содержимое тех файлов, которые имеют тип каталог. Мы также не делаем этого, если скрипт получил 0 аргументов ($# == 0), иначе ls -td -- выведет текущий каталог, так что вы получить . в качестве вывода.

Вместо GNU ls вы также можете использовать GNU stat для получения времени модификации файла таким образом, чтобы его можно было отсортировать с помощью GNU sort:

#! /bin/sh -
export TZ=UTC0 LC_ALL=C
stat --printf '%y@%n\0' -- "$@" | sort -rz | sed -z 's/^[^@]*@//;q' | tr '\0' '\n'

(с последней версией GNU sed для -z). Или используя GNU awk:

#! /bin/sh -
export TZ=UTC0 LC_ALL=C
stat --printf '%y@%n\0' -- "$@" | awk -v RS='\0' '
  NR == 1 || $0 > newest {newest = $0}
  END {if (NR) {sub(/[^@]*@/, "", newest); print newest}}'
1
28.01.2020, 05:21

Теги

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