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"');"}