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]}
Попробуйте:
$ ls -td -- */ | head -n 1
-t
опции делают сортировку ls
по времени модификации, новейшей первой.
Если вы хотите удалить /
:
$ ls -td -- */ | head -n 1 | cut -d'/' -f1
Обязательный ответ 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%/}
ls -td -- ./parent/*/ | head -n1 | cut -d'/' -f2
Отличие от решения Херсона - косая черта после *
, которая заставляет оболочку игнорировать все недирективные файлы.
В отличие от Gnouc, он будет работать, если вы находитесь в другой папке.
Cut необходимо знать количество родительских каталогов (2), чтобы удалить трейлинг '/'. Если у вас этого нет, используйте
VAR=$(ls -dt -- parent/*/ | head -n1); echo "${VAR::-1}"