Получите последний каталог (не последний файл)

Bash имеет regexp соответствие конструкции:

[[ $string =~ regexp ]]

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

shopt -s extglob
number=$filename
number=${number//[0-9][0-9]+([0-9])p}
number=${number%%+([^0-9])}
number=${number##*[^0-9]}
15
15.06.2014, 01:47
4 ответа

Попробуйте:

$ ls -td -- */ | head -n 1

-t опции делают сортировку ls по времени модификации, новейшей первой.

Если вы хотите удалить /:

$ ls -td -- */ | head -n 1 | cut -d'/' -f1
24
27.01.2020, 19:49

Обязательный ответ zsh:

latest_directory=(parent/*(/om[1]))

Символы в скобках являются глобусными классификаторами : / для сопоставления только с каталогами, om для сортировки совпадений по возрастанию и [1] для сохранения только первого (т.е. новейшего) совпадения. Добавьте N, если хотите получить пустой массив (обычно получается массив с 1-ым меню), если нет подкаталога parent.

Альтернативно, предполагая, что parent не содержит оболочки глобусного символа:

latest_directory='parent/*(/om[1])'; latest_directory=$~latest_directory

Если у вас нет zsh, но у вас есть последние инструменты GNU (т.е. не встроенная Linux или Cygwin), вы можете воспользоваться find, но это громоздко. Вот один способ:

latest_directory_inode=$(find parent -mindepth 1 -maxdepth 1 -type d -printf '%Ts %i\n' | sort -n | sed -n '1 s/.* //p')
latest_directory=$(find parent -maxdepth 1 -inum "$latest_directory_inode")

Есть простое решение с ls, которое работает до тех пор, пока ни одно имя каталога не содержит новых строк или (в некоторых системах) непечатаемых символов:

latest_directory=$(ls -td parent/*/ | head -n1)
latest_directory=${latest_directory%/}
3
27.01.2020, 19:49
ls -td -- ./parent/*/ | head -n1 | cut -d'/' -f2

Отличие от решения Херсона - косая черта после *, которая заставляет оболочку игнорировать все недирективные файлы. В отличие от Gnouc, он будет работать, если вы находитесь в другой папке.

Cut необходимо знать количество родительских каталогов (2), чтобы удалить трейлинг '/'. Если у вас этого нет, используйте

VAR=$(ls -dt -- parent/*/ | head -n1); echo "${VAR::-1}"
5
27.01.2020, 19:49

Вы можете сделать:

ls -td -- ../parent/* | head -n 1
2
27.01.2020, 19:49

Теги

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