民國三十四年5月20日,經過三天的休整後,按計劃美軍一部開始向南推進,以切斷日軍首里防線。
5月21日,美軍兩個陸戰師橫跨整個島嶼到達東海岸的中城灣,佔領島中部地區,將日軍防線一分為二。美軍原計劃十五天完成的任務,在志願軍的幫助下僅四天就順利實現。
沖繩島上的地面戰鬥因為志願軍的參與和消耗,在5月26日前,美軍一直比較順利,5月28日美軍陸戰一師和陸戰六師攻佔首里地區,將日軍再次分割為南北兩部分後,之後美軍兵分兩路,海軍陸戰隊第三軍向北逐步推進。
北面的第三軍在到達沖繩島頸部前,只遇到微弱的抵抗,直到5月30日才開始遇到日軍頑強抵抗,至6月2日將北半部日軍基本肅清,陸戰一師到達有銘灣,陸戰六師則到達最北面的邊戶崎。
牛島原本在大本營的一再督促下,準備於6月5日發動對機場總反擊,但在6月7日下午,發現那霸附近海面登陸的美軍再次增兵,牛島擔心美軍會從反擊部隊的側後實施登陸,加上他本來對這次反擊就不積極,正好以此為藉口取消了反擊,而將全部兵力用於依託工事進行堅守防禦,給美軍造成了很大困難。
6月10日日軍先以敢死隊員懷抱炸藥採取自殺攻擊方法炸毀美軍坦克,再對失去坦克掩護的美軍步兵發起衝鋒,美軍在日軍衝擊下,節節敗退,死傷將近5000,全憑後續部隊的重炮和海空優勢火力才將日軍攻勢遏制。
6月12日,志願軍兩個師在首里北約6.5公里處發動大規模進攻,五時四十分,重炮旅炮兵對日軍陣地進行了長達四十分鐘的炮擊,共發射了1.9萬發炮彈;接着美軍和志願軍聯合戰隊650架飛機也對日軍陣地實施了航空火力準備,投下大量的炸彈和凝固**。
此時的戰況就像是硫黃島戰鬥和慶良間血戰的重現,只是日軍的兵力和要爭奪的面積更多而已。
中美聯軍在推進至日軍主要防線約4500米前,雙方陷入僵持,巴克納乘機調整部署,將北部的陸戰一師和陸戰六師調到南線,而將南線的第二十七師調到北半島,接替兩個陸戰師的防務;文平也把攻佔伊江島的裝甲旅調了上去,投入南線。
聯軍完成調整後,以四個師展開攻擊,採取兩翼包抄戰術,迂迴夾擊日軍主要防線,以加快作戰進程。最後終於取得了進展,克服了日軍的頑強抵抗,突破了牧港防線。
6月15日,牛島見美軍和志願軍步步進逼,為爭取主動,一反其一直以來所堅持的堅守防禦方針,發動了孤注一擲的總反攻,以部分兵力由駁船運送在美軍戰線後方海岸實施登陸,配合主力從正面發動的攻擊,但由於得不到海空軍的有力支援,登陸部隊在航進途中被美軍發現,隨即遭到驅逐艦和地面炮火的轟擊,還未上岸就被消滅了,正面主攻部隊一離開堅固隱蔽的防禦工事,立即遭到美軍優勢炮火的集中轟擊,不到二十四小時反攻就被粉碎了。
牛島這次反擊得不償失,損失了大量人員,消耗了大量的彈藥,尤其是首里兵站被孤狼大隊給炸毀了,消耗的彈藥難以補充,使日軍的彈藥儲備接近枯竭,牛島不得不下令節省彈藥,每門炮平均每天只有十發炮彈,嚴重影響了日後的作戰。如果牛島不實施這次反擊,那麼反擊中損失的人員、彈藥可以在堅守防禦中堅持更多時間,給予美軍和志願軍更大的殺傷。
最後經過合商由美軍投入了新型的噴火坦克和重型坦克,冒着日軍的槍林彈雨,碾壓日軍的戰壕,沖入日軍的陣地,噴火坦克將凝固汽油射入日軍隱藏的山洞和坑道,日軍終於支撐不住,其防線逐漸被突破,但牛島隨即在夜色和煙霧掩護下,悄然組織部隊有序地撤往下一個防線,因此戰鬥發展成這樣一種模式:日軍先是憑險死守,接着美軍和志願軍在猛烈火力支援下取得突破,日軍後撤到下一道防線再死守,如此周而復始,日軍防區逐漸縮小。
當天十八時四十分,日軍運載「義烈空降隊」的十二架飛機陸續起飛,途中有四架飛機因故障返航或迫降,另有四架飛機在接近沖繩島時被美軍擊落,機上所載人員全部喪生,只有四架於二十二時抵達目的地,日機以機腹着陸方式在機場上降落,突擊隊員不等飛機完全停穩,就從機艙中跳下,向機場上停放的飛機投擲手榴彈和燃燒彈