Nu sunt foarte sigur cum să o fac pur și simplu în terminal, fără să devină prea greu de citit, dar cred că ai putea obține rezultatul pe care îl cauți, sau cel puțin să începi, cu ceva în acest sens:
Editare: actualizat cu informații din comentariu. S-a schimbat, de asemenea, secundar și primar, deoarece acestea erau inversate.
Edit2: am realizat că, în timp ce numele secundar nu se mai baza pe plasare, numele principal se bazează pe plasarea secundarului.
#!/bin/bash
input_directory="/path/to/your/data"
output_directory="/path/to/your/output"
cd „$input_directory”
pentru fișier în *; do
dacă [ ! -f „$fișier” ]; atunci
continua;
fi
# plasați numele secundare în „(mpc|flf|dtd)” separate de „|”
secundar=$(echo "$fișier" | grep -o -E "(mpc|flf|dtd)");
princple=$(echo "$fișier" | grep -o -E "([0-9]+_S_[0-9]+)");
# trece peste și alertează că o potrivire secundară nu a fost găsită pentru un fișier
if [ "$secundar" == "" ]; atunci
echo „Nu s-a găsit nicio potrivire secundară!! Se omite $fișier”;
continua;
fi
destination="${output_directory}/$secundar/$princple"
# creați directoarele dacă acestea nu există
dacă [ ! -d „$destinație” ]; atunci
mkdir -p „$destinație”;
fi
# decommentați pentru a muta fișierele în noile directoare dacă rezultatul testului
# de la ecou este corect
#mv „$fișier” „$destinație”
# test pentru a imprima rezultatul mutarii fișierelor
din=$(readlink -f „$fișier”)
echo „$de la -> $destinație/$fișier”
Terminat
grep -o -E "(mpc|flf|dtd)"
caută în numele fișierului unul dintre cuvintele cheie de nume secundare, de ex. (mpc, dtd sau flf) și salvează acel cuvânt în variabila secundară.
grep -o -E "([0-9]+_S_[0-9]+)
Aceeași idee, după căutarea modelului xxx_S_xxx.
Poate fi rulat ca: bash script.sh
The director_intrare
și directorul de ieșire
variabila va trebui completată cu căile corecte. De asemenea, câmpurile „(mpc|flf|dtd)” din instrucțiunea grep pot fi completate cu alte secundare.