Для тех, кто просто хочет получить ответ, вот он:
ls | sort -n -t _ -k 2 | tail -1
Вот мыслительный процесс, который привел меня сюда.
Я предполагаю, что часть [RANGE] может быть чем угодно.
Начните с того, что мы знаем.
- Рабочий каталог: / входящий / внешний / данные
- Формат файлов: [RANGE] _ [ГГГГММДД] .dat
Нам нужно найти самый последний файл [ГГГГММДД] в каталоге, и нам нужно сохранить это имя файла.
Доступные инструменты (я перечисляю только соответствующие инструменты для этой проблемы ... с практикой их выявление становится легче):
Полагаю, нам не нужен sed, так как мы можем работать со всем выводом команды ls. Используя ls, awk, sort и tail, мы можем получить правильный файл примерно так (имейте в виду, что вам придется проверять синтаксис относительно того, что примет ваша ОС):
NEWESTFILE=`ls | awk -F_ '{print $1 $2}' | sort -n -k 2,2 | tail -1`
Тогда нужно просто вернуть подчеркивание, что не должно быть слишком жестким.
РЕДАКТИРОВАТЬ: у меня было немного времени, поэтому я нашел время для исправления команды, по крайней мере для использования в Solaris.
Вот замысловатый первый проход (предполагается, что ВСЕ файлы в каталоге имеют одинаковый формат: [RANGE] _ [yyyymmdd] .dat). Держу пари, есть лучшие способы сделать это, но это работает с моими собственными тестовыми данными (на самом деле, я нашел лучший способ только сейчас; см. Ниже):
ls | awk -F_ '{print $1 " " $2}' | sort -n -k 2 | tail -1 | sed 's/ /_/'
... записывая это, я обнаружил, что вы можете просто сделать это:
ls | sort -n -t _ -k 2 | tail -1
Я разобью его на части.
ls
Достаточно просто ... получает список каталогов, только имена файлов. Теперь я могу передать это в следующую команду.
awk -F_ '{print $1 " " $2}'
Это команда AWK. это позволяет вам взять строку ввода и изменить ее особым образом. Здесь все, что я делаю, это указываю, что awk должен прерывать ввод везде, где есть подчеркивание (_). Я делаю это с опцией -F. Это дает мне две половины каждого имени файла. Затем я говорю awk, чтобы вывести первую половину ($ 1), а затем пробел ("")
Затем следует вторая половина (2 доллара). Обратите внимание, что место было той частью, которая отсутствовала в моем первоначальном предложении. Кроме того, в этом нет необходимости, поскольку вы можете указать разделитель в команде сортировки ниже.
Теперь вывод делится на [RANGE] [yyyymmdd] .dat в каждой строке. Теперь мы можем отсортировать это:
sort -n -k 2
Он принимает входные данные и сортирует их по второму полю. Команда sort по умолчанию использует пробел в качестве разделителя. Во время написания этого обновления я нашел документацию для сортировки, которая позволяет указать разделитель, поэтому AWK и SED не нужны. Возьмите ls и направьте его через следующий вид:
sort -n -t _ -k 2
Это дает тот же результат. Теперь вам нужен только последний файл, поэтому:
tail -1
Если вы использовали awk для разделения файла (что просто добавляет дополнительную сложность, поэтому не делайте этого sheepish ), вы можете снова заменить пробел подчеркиванием на sed:
sed 's/ /_/'
Здесь есть некоторая полезная информация, но я уверен, что большинство людей не собираются читать до конца, как это.