天天看點

How to deal with '/bin/rm:Argument list too long'

DBA在維護資料庫的時候,oracle dump檔案的數量可能會非常龐大,在處理這些dump檔案的時候,直接rm 可能會遇到Argument list too long這種問題。在linux系統中,删除大量的小檔案的時候,直接使用rm -rf *,花費的時間長,而且如果我們一次操作的檔案資料過多就會出現Argument list too long的錯誤。

例:

[[email protected] adump]$ ls -l | wc -l

229007

該目錄下有接近23W個檔案,在我們執行統一操作的時候會出現以下的錯誤。

[[email protected] adump]$ rm *.aud

-bash: /bin/rm: Argument list too long

[[email protected] oemrep]$ cp adump/* testdump/

-bash: /bin/cp: Argument list too long

下面介紹删除大量檔案的方法:

方法一:

使用ls+xargs方式:

ls | xargs -n 10 rm -fr

xargs就是将ls的輸出,每10個為一組(以空格為分隔符),作為rm -rf的參數;也就是說将所有檔案名10個為一組,由rm -rf删除。

用這種方法删除上面的23w個檔案,僅僅用了10多s

方法二:

使用reync指令,該指令删除大量大小檔案都很迅速

  rsync --help | grep delete

--del                 an alias for --delete-during

--delete              delete extraneous files from destination dirs

--delete-before       receiver deletes before transfer, not during

--delete-during       receiver deletes during transfer (default)

--delete-delay        find deletions during, delete after

--delete-after        receiver deletes after transfer, not during

--delete-excluded     also delete excluded files from destination dirs

--ignore-errors       delete even if there are I/O errors

--max-delete=NUM      don't delete more than NUM files

其中--delete-before接收者在傳輸之前進行删除操作

1、先建立一個空目錄

mkdir /data/blank

2、用rsync删除目标目錄

rsync --delete-before -d -a -H -v --progress --stats /u01/app/oracle/admin/oemrep/adump  /data/blank

或者

rsync --delete-before -d /data/blank/ /var/edatacache/

這樣/var/edatacache目錄就被快速的清空了。

選項說明:

–delete-before 接收者在傳輸之前進行删除操作

–progress      在傳輸時顯示傳輸過程

-a             歸檔模式,表示以遞歸方式傳輸檔案,并保持所有檔案屬性

-H             保持硬連接配接的檔案

-v             詳細輸出模式

–stats         給出某些檔案的傳輸狀态

-d             transfer directories without recursing

方法三:

使用find -exec指令:find .... -exec [command] {} \;

适合crontab任務,大批量删除檔案較上面方法慢一些。find指令的參數比較多,使用也比較靈活。

如删除10天以前生成的檔案:

find /u01/app/oracle/admin/cedb/adump -name "cedb_ora*.aud" -mtime +10 -exec rm -f {} \;

-mtime -n  n天以内

-mtime +n  n天以前

-mmin -n   n分鐘以内

-mmin +n   n分鐘以前   ..等等