Cp

CP:複製實用程序的最大源文件數量參數

  • July 20, 2021

考慮到 /src/ 下有無數個文件

cp /src/* /dst/

有多少文件cp將成功處理?

這在很大程度上取決於系統和版本、參數的數量和大小以及環境變數名稱的數量和大小。

傳統上,在 Unix 上,限制(如 所報告的getconf ARG_MAX)或多或少取決於以下各項的累積大小:

  • 參數字元串的長度(包括終止符'\0'
  • 指向這些字元串的指針數組的長度,因此通常在 64 位系統上每個參數 8 個字節
  • 環境字元串(包括終止符)的長度,按照'\0'約定,環境字元串類似於var=value.
  • 指向這些字元串的指針數組的長度,因此通常在 64 位系統上每個參數 8 個字節

請記住,這cp也算作一個論點(是第一個論點)。

在 Linux 上,這取決於版本。那裡的行為最近發生了變化,不再是固定空間。

檢查 Linux 3.11,getconf ARG_MAX現在報告堆棧大小限制的四分之一,如果小於 512kiB,則為 128kiB)。

zsh下面的語法):

$ limit stacksize
stacksize       8MB
$ getconf ARG_MAX
2097152
$ limit stacksize 4M
$ getconf ARG_MAX
1048576

該限制是參數和環境字元串的累積大小以及一些成本(我懷疑是由於頁面邊界上的對齊考慮)。不考慮指針的大小。

尋找極限,我得到:

$ /bin/true {1..164686}
$ /bin/true {1..164687}
zsh: argument list too long: /bin/true
$ x= /bin/true {1..164686}
$ x=1 /bin/true {1..164686}
zsh: argument list too long: /bin/true

在這種情況下,中斷前的最大累積大小為:

$ (env _=/bin/true x=;print -l /bin/true {1..164686}) | wc -c
1044462

現在,這並不意味著您可以傳遞 100 萬個空參數。在 64 位系統上,100 萬個空參數構成一個 8MB 的指針列表,這將超過我的 4MiB 堆棧大小。

$ IFS=:; /bin/true ${=${(l[1000000][:])}}
zsh: killed     /bin/true ${=${(l[1000000][:])}}

(您會注意到這不是 E2BIG 錯誤。我不確定該程序在什麼時候被殺死,儘管它是否在execve系統呼叫中或更高版本中)。

另請注意(仍然在 Linux 3.11 上)單個參數或環境字元串的最大大小為 128kiB,無論堆棧大小如何。

$ /bin/true ${(l[131071][a])} # 131072 OK
$ /bin/true ${(l[131072][a])} # 131073 not
zsh: argument list too long: /bin/true
$ /bin/true ${(l[131071][a])} ${(l[131071][a])} # 2x 131072 OK

引用自:https://unix.stackexchange.com/questions/110282