mv argument list too long錯誤

家中領導負責的一個系統,在清理過期文件的時候,提示了個錯誤,是時候展示真正的技術了,

mv argument list too long錯誤


需求

Linux中,有如下路徑結構,

mv argument list too long錯誤


需要將/opt/app/log中"a"開頭和".log"為後綴的文件,挪動到/opt/app/log/backup文件夾中,符合條件的文件數量有幾十萬,此時執行mv,則會提示mv參數列表太長的錯誤,

mv argument list too long錯誤


問題

這是因為mv移動的文件數量太多了,此時不能通過mv移動文件。


解決方案1

Argument list too long本質是需要處理的長度超過系統的長度,因此無法執行相關命令。


既然參數過長,直觀的思路,就是減少參數,分而治之的方式,來解決這問題。


此時就可以藉助find找出符合條件的文件,然後拆開執行,mv的指令,有兩種執行方式,一個是xargs,另一個是-exec。


xargs指令是給其他指令傳遞參數的一個過濾器,也是組合多個命令的一個工具,-i會將xargs的內容賦值給{}。


-exec參數後面是指執行其後面的指令,-exec以;為結尾,由於各個系統中分號的意義不同,因此用\\進行轉義,即\\;,{}會被find指令的結果替換。


我們採用-exec,拼接指令如下,find首先找出符合條件的文件,然後{}會替換find的結果,依次執行mv,

mv argument list too long錯誤


從結果來看,a*.log的文件,確實從/opt/app/log移到/opt/app/log/backup,但是執行了多少次的mv,就會提示多少次"... and ... are the same file",相當於刷屏幾十萬次,這是為什麼?


而 且從提示看,"./backup/a1.log"和"/opt/applog/backup/a1.log",因為此時使用"cd /opt/app/log",已經是在/opt/app/log下執行了,所以"./backup/a1.log"和"/opt/applog /backup/a1.log"其實就是同一個文件。


解決方案2

從Stackoverflow的一個帖子,看到這種解釋,find指令會遞歸到/opt/app/log/backup/路徑下搜索文件,

mv argument list too long錯誤


按照他說的,相當於我在/opt/app/log/和/opt/app/log/backup/下都要搜索一次a*.log,此時執行mv,會提示文件重複,禁止執行。

既然知道了解釋,如何解決?


我們檢索的目標,其實就是/opt/app/log/,因此不讓find找/opt/app/log/backup/路徑,就可以了。此時,可以使用"-not -path",指定不掃描。


使用如下指令,"-not -path"跟著/opt/app/log/backup/,表示不掃描/opt/app/log/backup/路徑,

mv argument list too long錯誤


此時就能正常執行指令mv,不會出現提示的錯誤了。


分享到:


相關文章: