在linux中刪除大量文件時,直接用rm會出現:-bash: /bin/rm: 參數列表過長,的錯誤。
這時能夠用find命令來結合使用。
例:
一、rm * -rf 改成:
find . -name "*" | xargs rm -rf '*' 就好了。
二、rm test* -rf 改成:
find . -name "test*" | xargs rm -rf "test*"node
mv時報參數列表過長,linux
for i in *.m;do mv $i ${i%.m};doneshell
因而求助於google,探索過程就省略了,直接說解決方法吧:bash
ls dir1 | xargs -t -I {} mv {} dir2/{}ide
這裏的一對大括號是原文給的例子裏用的,後來看了參數的用法,其實那對大括號是能夠用任意字符串替換的,好比:函數
ls dir1 | xargs -t -I asdf mv asdf dir2/asdf測試
效果和大括號那一版是徹底同樣的,就是看起來有點兒不嚴肅。this
須要說明的是,上面xargs的第二個參數,是大寫的i,讀做」愛「的那個字母,不是小寫的L。至於參數的含義嘛,我忘了。google
Linux下 報錯「命令參數列表過長」,在用mv命令一次移動3萬多個文件時失敗了,原始命令相似這樣:」mv $(ls dir1) dir2「。錯誤提示的中心思想是:」你這參數也太TM多了吧「。spa
按照LZ想法大概能夠這麼作:find /dir1/ -maxdepth 1 | xargs -i mv {} /dir2/
若是參數過長,使用tar比較簡單
tar -C /dir1/ -cf - . | tar -xf - -C /dir2/
因而求助於google,探索過程就省略了,直接說解決方法吧:
ls dir1 | xargs -t -I {} mv {} dir2/{}
這裏的一對大括號是原文給的例子裏用的,後來看了參數的用法,其實那對大括號是能夠用任意字符串替換的,好比:
ls dir1 | xargs -t -I asdf mv asdf dir2/asdf
效果和大括號那一版是徹底同樣的,就是看起來有點兒不嚴肅。
須要說明的是,上面xargs的第二個參數,是大寫的i,讀做」愛「的那個字母,不是小寫的L。至於參數的含義嘛,我忘了。
另外4種方法
做爲一個linux用戶/系統管理員, 有些時候你會遇到如下錯誤提示:
[user@localhost foo]$ mv * ../foo2
bash: /bin/mv: Argument list too long
「Argument list too long」參數列表過長錯誤常常發生在用戶在一行簡單命令中提供了過多的參數而致使,常常在ls *, cp *, rm * 等中出現。
根據問題的緣由如下提供了四種方法,能夠根據本身的狀況酌情選用
方法1 : 將文件羣手動劃分爲比較小的組合
e.g 1:
[user@localhost foo]$ mv [a-l]* ../foo2
[user@localhost foo]$ mv [m-z]* ../foo2
這是最基本的方法,只是簡單的使參數數量符合要求,這種方法應用範圍有限,只適用於文件列表中的名字分佈比較均勻,另外這也是個初級用戶能夠考慮的解決方案,不過須要不少重複命令和對文件名分佈的觀察與猜想。
方法2 : 使用find命令
e.g 2:
[user@localhost foo]$ find $foo -type f -name '*' -exec mv {}$foo2/. \;
方法2經過find命令,將文件清單輸出到mv命令,使其一次處理一個,這樣就徹底避免了過量參數的存在,另外經過不一樣的參數,能夠指定除了名稱之外的時間戳,權限,以及inode等匹配模式。
方法2的缺點在於比較耗費時間。
方法3 : 建立shell函數
e.g 3.1:
function huge_mv ()
{whileread line1; do
mv foo/$line1 ../foo2
done
}
ls -1 foo/ | huge_mv
寫一個shell函數並不涉及到某種程度的複雜性, 這種方法比方法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校驗散列文件和名字備份,符合給本身留條後路的哲學。
另外能夠根據本身的須要無限制的擴展功能。
方法4 : 終極解決方案,從新編譯內核
首先使用這個方案以前要謹慎,由於涉及到修改內核源代碼,在生產環境中仍是要斟酌一下並作好測試。
另外,這個方法是從根本上解決的,一勞永逸的
這也是開放源碼的好處之一
首先在內核源碼中找到 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數值爲 64 或者更高便可完善的解決參數受限問題。而後 從新編譯並啓用新內核便可。