Я не совсем уверен, как сделать это исключительно в терминале, чтобы его не было слишком сложно читать, но я думаю, что вы могли бы получить результат, который ищете, или, по крайней мере, начать с чего-то вроде этого:
Изменить: обновлено информацией из комментария. Также поменял местами вторичный и первичный, так как они были задом наперед.
Edit2: понял, что, хотя вторичное имя больше не зависело от размещения, основное имя зависело от вторичного размещения.
#!/бин/баш
input_directory="/путь/к/вашим/данным"
output_directory="/path/to/your/output"
компакт-диск "$ input_directory"
для файла в *; делать
если [ ! -f "$файл" ]; тогда
Продолжить;
фи
# поместите ваши вторичные имена внутри "(mpc|flf|dtd)", разделенные символом '|'
вторичный=$(echo "$file" | grep -o -E "(mpc|flf|dtd)");
princple=$(echo "$file" | grep -o -E "([0-9]+_S_[0-9]+)");
# пропустить и предупредить, что вторичное совпадение для файла не найдено
если [ "$вторичный" == "" ]; тогда
echo "Вторичное совпадение не найдено!! Пропущен файл $file";
Продолжить;
фи
назначение = "${output_directory}/$вторичный/$принцип"
# создаем каталоги, если они не существуют
если [ ! -d "$ место назначения" ]; тогда
mkdir -p "$ место назначения";
фи
# раскомментируйте, чтобы переместить файлы в новые каталоги, если тестовый вывод
# из эха правильно
#mv "$file" "$destination"
# тест для вывода результата перемещения файлов
from=$(readlink -f "$file")
echo "$from -> $destination/$file"
сделано
grep -o -E "(mpc|flf|dtd)"
ищет в имени файла одно из ключевых слов вторичного имени, например. (mpc, dtd или ffl) и сохраняет это слово во вторичной переменной.
grep -o -E "([0-9]+_S_[0-9]+)
Та же идея, если искать шаблон xxx_S_xxx.
Его можно запустить как: bash-скрипт.sh
input_directory
и выходной каталог
переменная должна быть заполнена правильными путями. Кроме того, поля "(mpc|flf|dtd)" в операторе grep могут быть заполнены другими вторичными параметрами.