rm 时argument list too long
生活随笔
收集整理的這篇文章主要介紹了
rm 时argument list too long
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
ls|xargs?rm?-f四種解決”Argument?list?too?long”參數列表過長的辦法
轉自
http://hi.baidu.com/cpuramdisk/item/5aa49ce00c0757aecf2d4f24
在linux中刪除大量文件時,直接用rm會出現:-bash:?/bin/rm:?參數列表過長,的錯誤。這時可以用find命令來結合使用。例:
1、rm?*?-rf?改為:
find?.?-name?"*"?|?xargs?rm?-rf?'*'?就行了。2、rm?test*?-rf?改為:
find?.?-name?"test*"?|?xargs?rm?-rf?"test*"mv時報參數列表過長,
for?i?in?*.m;do?mv?$i?${i%.m};done
于是求助于google,探索過程就省略了,直接說解決方法吧:
ls?dir1?|?xargs?-t?-I?{}?mv?{}?dir2/{}
這里的一對大括號是原文給的例子里用的,后來看了參數的用法,其實那對大括號是可以用任意字符串替換的,比如:
ls?dir1?|?xargs?-t?-I?asdf?mv?asdf?dir2/asdf
效果和大括號那一版是完全一樣的,就是看起來有點兒不嚴肅。
需要說明的是,上面xargs的第二個參數,是大寫的i,讀作”愛“的那個字母,不是小寫的L。至于參數的含義嘛,我忘了。Linux下?報錯“命令參數列表過長”,在用mv命令一次移動3萬多個文件時失敗了,原始命令類似這樣:”mv?$(ls?dir1)?dir2“。錯誤提示的中心思想是:”你這參數也太TM多了吧“。
按照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?或者更高即可完善的解決參數受限問題。
然后?重新編譯并啟用新內核即可。
轉載于:https://blog.51cto.com/yuzwei/1872703
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的rm 时argument list too long的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在windows7上的通过compose
- 下一篇: sass1: