2010-11-15 11 views
23

Recentemente ho copiato e spostato un gran numero di file (~ 400.000). So che ci sono limitazioni sul numero di argomenti che possono essere espansi sulla riga di comando di Bash, quindi ho usato xargs per limitare i numeri prodotti.Numero massimo di argomenti Bash! = Max argomenti num cp?

Per curiosità, mi sono chiesto quale fosse il numero massimo di argomenti che potrei usare, e ho trovato this post dicendo che era dipendente dal sistema, e che avrei potuto eseguire questo comando per scoprire:

$ getconf ARG_MAX 

Con mia grande sorpresa, l'anwser sono tornato era:

2621440 

Poco più di 2,6 milioni di . Come ho detto, il numero di file che sto manipolando è molto inferiore a questo - circa 400k. Devo assolutamente utilizzare il metodo xargs per spostare e copiare questi file, perché ho provato a utilizzare un normale mv * ... oe ho ricevuto un errore "Argument list too long".

Quindi, i comandi mv e cp hanno il loro limite fisso sul numero di argomenti che è possibile utilizzare (non sono riuscito a trovare nulla nelle loro pagine man) o mi manca qualcosa?

+0

Perché è necessario specificare ogni file? Non puoi semplicemente specificare la directory in cui si trovano o qualcosa del genere? –

+0

@Christoffer Non sto solo copiando una directory da un posto a un altro, sto copiando file specifici, rinominando un sacco di file, spostando determinati file da un posto a un altro. Non ho alcun problema nell'eseguire effettivamente queste operazioni. Ero solo curioso di sapere quali fossero i limiti specifici dei comandi 'cp' e' mv'. –

risposta

23

Come detto Ignacio, ARG_MAX è la lunghezza massima del buffer di di argomenti passati exec(), non il numero massimo di file (this page ha una spiegazione molto approfondita). In particolare, essa elenca fs/exec.c come verifica la seguente condizione:

PAGE_SIZE*MAX_ARG_PAGES-sizeof(void *)/sizeof(void *) 

E, a quanto pare, si dispone di alcune limitazioni aggiuntive:

Su Linux a 32 bit, questo è argmax/4-1 (32767). Questo diventa rilevante se la lunghezza media degli argomenti è inferiore a 4. Poiché Linux 2.6.23, questa funzione verifica se il numero supera MAX_ARG_STRINGS in <linux/binfmts.h> (2^32-1 = 4294967296-1). E come limite aggiuntivo, un argomento non deve essere più lungo di MAX_ARG_STRLEN (131072).

6

ARG_MAX è la lunghezza massima degli argomenti delle funzioni exec(3). Non è richiesta una shell per supportare il passaggio di questa lunghezza di argomenti dalla sua riga di comando.

+0

Ma bash non applica _any_ limit, dice [this] (http://www.in-ulm.de/~mascheck/various/argmax/); cerca semplicemente 'exec' e passa un errore del sistema operativo se l'elenco degli argomenti è troppo lungo. – alexis

Problemi correlati