Ești adânc în a cita iadul acolo.
Ta găsi comanda trece la sh -c un argument de genul
mkdir -p "$(dirname /mnt/data/test/20220508/mnt/data/abc/def.log)"; atingeți /mnt/data/test/20220508/mnt/data/abc/def.log; du -S /mnt/data/abc/def > /mnt/data/test/20220508/mnt/data/abc/def.log; awk -F'\t' '{printează „INSERT INTO DATE20220508(folder_size, folder_location) VALUES('$1', '$2');"}' /mnt/data/test/20220508/mnt/data/abc/def. Buturuga
Acum SH analizează acest lucru, eliminând un nivel de citare. Se extinde $(dirname /mnt/data/test/20220508/mnt/data/abc/def.log) la /mnt/data/test/20220508/mnt/data/abc, și variabilele $1 și $2 în awk pentru a goli șiruri de caractere (din moment ce nu a primit niciun parametru de poziție), dând
mkdir -p /mnt/data/test/20220508/mnt/data/abc; atingeți /mnt/data/test/20220508/mnt/data/abc/def.log; du -S /mnt/data/abc/def > /mnt/data/test/20220508/mnt/data/abc/def.log; awk -F\t '{printează "INSERT INTO DATE20220508(folder_size, folder_location) VALUES(, );"}' /mnt/data/test/20220508/mnt/data/abc/def.log
(Am reinserat ghilimele simple în jurul lui awk Argumentul text al programului pentru claritate.)
Cea mai ușoară cale de ieșire este să creați un fișier pentru awk program la care apoi treceți awk prin intermediul -f opțiune. Apoi, aș recomanda și să faceți sarcina FS = „\t” în acel fișier în loc să utilizați -F opțiune.
În cele din urmă, dacă nu mai aveți nicio utilizare pentru fișierele jurnal, cu excepția creării instrucțiunilor SQL, vă puteți simplifica considerabil scriptul prin canalizarea ieșirii du direct către awk, cum ar fi:
DT=`data +"%Y%m%d"`
find /mnt/data -maxdepth 2 -mindepth 2 -type d -exec sh -c 'du -S {} | awk -v DT='$DT' -f /mnt/data/makeinserts.awk' \;
cu dosarul /mnt/data/makeinserts.awk conţinând purul awk program:
ÎNCEPE{FS="\t"}
{printați „INSERT INTO DATE”DT”(dimensiune_dosar, locație_dosar) VALUES('"$1"', '"$2"');"}