Создание массива уникальных имён директорий в сценарии Bash

 

 Bashсниппет

Идея для написания этой заметки возникла при решении практической задачи: необходимо обработать определённым образом большое количество директорий, различного уровня вложенности, содержащих файлы определённого типа, на сервере, работающем под управлением операционной системы Fedora Server без графического оконного менеджера. В этих условиях наиболее удобным решением является написание сценария на языке Bash.

При проектировании сценария я решил, что прежде всего, он должен создать массив, состоящий из уникальных имён директорий, содержащих файлы заданного типа, а уже потом проводить требуемые манипуляции с этими директориями, беря их имена из массива.

Так как эта часть, написанного мною сценария, является универсальной и демонстрирует возможность считывания имён объектов файловой системы в массив, что вызывает частые вопросы у начинающих знакомство с разработкой собственных сценариев на языке Bash, я решил поделиться фрагментом своего кода, дополнив его необходимыми для понимания комментариями.

#массив, содержащий имена директорий
declare -a dirs
#переменная, содержащая корневую директорию для начала поиска
declare -r src="/home/username/src"
#переменная, содержащая маску для поиска файлов
declare -r mask="*.cue"

#функция для проверки вхождения значения в массив: 0 - да, 1 - нет
elementIn () {
    local e
    for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done
    return 1
}

while read file; do
    #получение директории из имени файла
    directory="$(dirname "$file")"
    #вызов функции elementIn
    elementIn "$directory" "${dirs[@]}"
    #проверка значения, возвращённого функций elementIn, добавление значения в массив
    [[ $? -eq 1 ]] && dirs+=( "$directory" )
done < <(find "$src" -name "$mask" -type f)

#пример дальнейшей работы с массивом dirs
for directory in "${dirs[@]}"; do
    echo "$directory"
done

Взяв за основу приведённый код, вы можете понять, как работать с массивами в Bash, добавлять в сценарии собственные функции и получать значения, возвращаемые ими. Это позволит расширить перечень повседневных и профессиональных задач, решаемых с использованием сценариев Bash.