溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Argument?list?too?long參數(shù)列表過長如何解決

發(fā)布時間:2023-02-25 10:28:09 來源:億速云 閱讀:103 作者:iii 欄目:開發(fā)技術

今天小編給大家分享一下Argument list too long參數(shù)列表過長如何解決的相關知識點,內(nèi)容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    四種解決”Argument list too long”參數(shù)列表過長的辦法

    在linux中刪除大量文件時,直接用rm會出現(xiàn):-bash: /bin/rm: 參數(shù)列表過長的錯誤。

    這時可以用find命令來結合使用。

    例:
    1、rm * -rf 改為:

    find . -name "*" | xargs rm -rf '*' 就行了

    2、rm test* -rf 改為:

    find . -name "test*" | xargs rm -rf "test*"

    mv時報參數(shù)列表過長,

    for i in *.m;do mv $i ${i%.m};done

    于是求助于google,探索過程就省略了,直接說解決方法吧:

    ls dir1 | xargs -t -I {} mv {} dir2/{}

    這里的一對大括號是原文給的例子里用的,后來看了參數(shù)的用法,其實那對大括號是可以用任意字符串替換的,比如:

    ls dir1 | xargs -t -I asdf mv asdf dir2/asdf

    效果和大括號那一版是完全一樣的,就是看起來有點兒不嚴肅。

    需要說明的是,上面xargs的第二個參數(shù),是大寫的i,讀作”愛“的那個字母,不是小寫的L。至于參數(shù)的含義嘛,我忘了。

     Linux下 報錯“命令參數(shù)列表過長”,在用mv命令一次移動3萬多個文件時失敗了,原始命令類似這樣:”mv $(ls dir1) dir2“。錯誤提示的中心思想是:”你這參數(shù)也太TM多了吧“。

    按照LZ想法大概可以這么做:find /dir1/ -maxdepth 1 | xargs -i mv {} /dir2/
    如果參數(shù)過長,使用tar比較簡單

    tar -C /dir1/ -cf - . | tar -xf - -C /dir2/

      于是求助于google,探索過程就省略了,直接說解決方法吧:

    ls dir1 | xargs -t -I {} mv {} dir2/{}

      這里的一對大括號是原文給的例子里用的,后來看了參數(shù)的用法,其實那對大括號是可以用任意字符串替換的,比如:

    ls dir1 | xargs -t -I asdf mv asdf dir2/asdf

      效果和大括號那一版是完全一樣的,就是看起來有點兒不嚴肅。

      需要說明的是,上面xargs的第二個參數(shù),是大寫的i,讀作”愛“的那個字母,不是小寫的L。至于參數(shù)的含義嘛,我忘了。

    另外4種方法

    作為一個linux用戶/系統(tǒng)管理員, 有些時候你會遇到以下錯誤提示:

    [user@localhost foo]$ mv * ../foo2

    bash: /bin/mv: Argument list too long

    “Argument list too long”參數(shù)列表過長錯誤經(jīng)常發(fā)生在用戶在一行簡單命令中提供了過多的參數(shù)而導致,經(jīng)常在ls *, cp *, rm * 等中出現(xiàn)。
    根據(jù)問題的原因以下提供了四種方法,可以根據(jù)自己的情況酌情選用

    方法1 : 將文件群手動劃分為比較小的組合
    e.g 1:

    [user@localhost foo]$ mv [a-l]* ../foo2
    
    [user@localhost foo]$ mv [m-z]* ../foo2

    這是最基本的方法,只是簡單的使參數(shù)數(shù)量符合要求,這種方法應用范圍有限,只適用于文件列表中的名字分布比較均勻,另外這也是個初級用戶可以考慮的解決方案,不過需要很多重復命令和對文件名分布的觀察與猜測。

    方法2 : 使用find命令
    e.g 2:

    [user@localhost foo]$ find $foo -type f -name '*' -exec mv {}$foo2/. \;

    方法2通過find命令,將文件清單輸出到mv命令,使其一次處理一個,這樣就完全避免了過量參數(shù)的存在,另外通過不同的參數(shù),可以指定除了名稱以外的時間戳,權限,以及inode等匹配模式。
    方法2的缺點在于比較耗費時間。

    方法3 : 創(chuàng)建shell函數(shù)
    e.g 3.1:

    function huge_mv ()
    {whileread line1; do
    mv foo/$line1 ../foo2
    done
    }
    ls -1 foo/ | huge_mv

    寫一個shell函數(shù)并不涉及到某種程度的復雜性, 這種方法比方法1和方法2相比更加靈活。
    下面我們來擴展一下例3.1 :
    e.g 3.2:

    function huge_mv ()
    {whileread line1; do
    md5sum foo/$line1 >> ~/md5sums
    ls -l foo/$line1 >> ~/backup_list
    mv foo/$line1 ../foo2
    done
    }
    ls -1 foo/ | huge_mv

    相比例3.1,例3.2生成了文件的md校驗散列文件和名字備份,符合給自己留條后路的哲學。
    另外可以根據(jù)自己的需要無限制的擴展功能。

    方法4 : 終極解決方案,重新編譯內(nèi)核

    首先使用這個方案之前要謹慎,因為涉及到修改內(nèi)核源代碼,在生產(chǎn)環(huán)境中還是要斟酌一下并做好測試。
    另外,這個方法是從根本上解決的,一勞永逸的 
    這也是開放源碼的好處之一 
    首先在內(nèi)核源碼中找到 include/linux/binfmts.h文件 ,搜索到以下字段:

    /*
    * MAX_ARG_PAGES defines the number of pages allocated for arguments
    * and envelope for the new program. 32 should suffice, this gives
    * a maximum env+arg of 128kB w/4KB pages!
    */
    #define MAX_ARG_PAGES 32

    修改 MAX_ARG_PAGES數(shù)值為 64 或者更高即可完善的解決參數(shù)受限問題。
    然后 重新編譯并啟用新內(nèi)核即可。

    補充:Linux中“Argument list too long”解決方法

    當我想執(zhí)行以下命令時,報錯:

    mv train2014/* coco_train2014/
    -bash: /bin/mv: Argument list too long

    這是因為這些命令的參數(shù)太長,即文件個數(shù)過多。其中 train2014 文件夾的內(nèi)容全是 .jpg 格式的圖片文件 解決的方法如下:

    find train2014/ -name "*.jpg" | xargs -i mv {} coco_train2014/

    同理使用 cp, ls 等命令也可以以同樣的方式執(zhí)行:

    拷貝:

    find train2014/ -name "*.jpg" | xargs -i cp {} coco_train2014/

    刪除:

    find train2014/ -name "*.jpg" | xargs -i rm {}

    以上就是“Argument list too long參數(shù)列表過長如何解決”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業(yè)資訊頻道。

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

    AI