AIX использует ksh (korn shell )Redhat использует Bash (bourne Again shell )Так что решение простое. Установите bash на aix. Вот репозиторий , и вы также можете использовать yum. Затем с помощью команды chuser измените оболочку пользователя.
Предполагая, что неправильных имен файлов действительно нет, запустите в этом каталоге:
ls -U | awk '-F[_.]' '{ print $2 }' | sort | uniq
Предположим, что все имена файлов соответствуют шаблону./*_*.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
. Строка не будет выведена, если она соответствует ключу в массиве.