Допустим, у меня есть эти файлы в папке Test1

AAAA-12_21_2020.txt
AAAA-12_20_2020.txt
AAAA-12_19_2020.txt
BBB-12_21_2020.txt
BBB-12_20_2020.txt
BBB-12_19_2020.txt

Я хочу, чтобы нижеприведенные последние файлы были помещены в папку Test2

AAAA-12_21_2020.txt
BBB-12_21_2020.txt

user3047923

Ответов: 2

Ответы (2)

Используя awk:

ls -1 Test1/ | awk -v src_dir="Test1" -v target_dir="Test2" -F '(-|_)' '{p=$4""$2""$3; if(!($1 in b) || b[$1] < p){a[$1]=$0}} END {for (i in a) {system ("mv "src_dir"/"a[i]" "target_dir"/")}}'

Этот код будет работать:

ls $1 -U | sort | cut -f 1 -d "-" | uniq | while read -r prefix; do
    ls $1/$prefix-* | sort -t '_' -k3,3V -k1,1V -k2,2V | head -n 1
done

Сначала мы перебираем все префиксы в каталоге, указанном в качестве первого аргумента, который мы получаем путем сортировки списка файлов и удаления дубликатов, перед извлечением всего до -. Затем мы сортируем эти имена файлов по трем полям, разделенным символом _, используя опцию sort -k (в первую очередь по годам в третьем поле, затем по месяцам во втором и, наконец, по дням). Мы используем сортировку по версии, чтобы иметь возможность игнорировать текст вокруг и правильно интерпретировать числа (в отличие от лексикографической сортировки).

Я не уверен, что это лучший способ сделать это, поскольку я использовал только базовые функции bash. Из-за формата даты и того факта, что вам нужно различать префиксы, вы должны полностью разобрать строку, что является работой, лучше подходящей для AWK или Perl.

Тем не менее, я бы предложил использовать формат день-месяц-год или год-месяц-день для машиночитаемых имен файлов.

2022 WebDevInsider