Поиск общего/образца в группе файлов

AIX использует ksh (korn shell )Redhat использует Bash (bourne Again shell )Так что решение простое. Установите bash на aix. Вот репозиторий , и вы также можете использовать yum. Затем с помощью команды chuser измените оболочку пользователя.

0
05.04.2020, 21:46
2 ответа

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

ls -U | awk '-F[_.]' '{ print $2 }' | sort | uniq
1
28.04.2021, 23:18

Предположим, что все имена файлов соответствуют шаблону./*_*.jpg:

for name in./*_*.jpg; do
    name=${name##*_}              # 4457582_20180927.jpg --> 20180927.jpg
    printf '%s\n' "${name%.jpg}"  # 20180927.jpg --> 20180927
done | sort -u

Повторяется по всем именам. Затем для каждого имени удаляется самая длинная строка префикса, соответствующая *_. Затем он выводит оставшуюся строку с удаленным суффиксом .jpg.

Затем все строки сортируются таким образом, что в конце выводится только список уникальных строк.

Если существует риск того, что каталог может быть пустым, следует установить параметр оболочки nullglobперед циклом(shopt -s nullglob). Это приведет к тому, что цикл вообще не запустится вместо того, чтобы запуститься один раз с нерасширенным шаблоном подстановки в $name.


Без особой причины, вот как это сделать безsort:

declare -A skip=()

for name in./*_*.jpg; do
    key=${name##*_}    # 4457582_20180927.jpg --> 20180927.jpg
    key=${key%.jpg}    # 20180927.jpg --> 20180927
    if [[ ! -v skip[$key] ]]; then
        printf '%s\n' "$key"
        skip[$key]=1
    fi
done

Здесь я отслеживаю, какие строки уже были выведены как ключи в ассоциативном массиве, skip. Строка не будет выведена, если она соответствует ключу в массиве.

3
28.04.2021, 23:18

Теги

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