Newsgroup: it.comp.os.linux.iniziare
Titolo: cambiare valore di ARG_MAX

ho un problema con una directory con moltissimi file
non riesco piu' a usare programmi come ls grep ecc in modo normale
 
per es.:
ls *.txt
bash: /usr/bin/ls: Argument list too long
 
grep a *.txt
bash: /usr/bin/grep: Argument list too long
 
 
ho letto che bisognerebbe cambiare il valore di ARG_MAX
 
getconf ARG_MAX
2097152
che corrisponde a 2 elevato a 21)
 
 
uname -r
3.10.0-327.3.1.el7.x86_64
 
cat /etc/centos-release
CentOS Linux release 7.2.1511 (Core)
 
 
il valore successivo a cui si puo' impostare e' 2 elevato a 22 (4194304)?
 
devo per forza ricompilare tutto il kernel per modificare questo valore 
o si puo' dare qualche comando a volo?

 o si puo' dare qualche comando a volo?
 
Non è necessario cambiare ARG_MAX
 
https://en.wikipedia.org/wiki/Xargs
 

 
https://en.wikipedia.org/wiki/Xargs
 
 
 
si ma dovrei ricontrollare/modificare un sacco di script..
gli script attuali sono stati testati un sacco di volte e funzionanti al 
100% invece modificandoli dovrei prima ritestarli a fondo...
 
modificando ARG_MAX potrei continuare a usarli..
 
 


Hai valutato la reale necessità di avere quantità così spropositate
di files in una directory? Probabilmente vale la pena agire sui
processi che la riempiono e non la svuotano.

 di files in una directory?
 
pensavo che al massimo il computer potesse metterci piu' tempo per 
eseguire le operazioni.. non che si sedesse proprio
 
avevo testato gli script con directory con 20-30 mila file.. non pensavo 
che con andando oltre i 100mila file avessi avuto questi problemi
 
appena ho tempo vedo di sistemarli.. ma nel frattempo vorrei trovare una 
soluzione
 


se fai un for i in * è ovvio che la lista prodotta dalla bash non puo 
essere infinita
Un limite deve averlo
con questo comando:
getconf ARG_MAX
 
hai il valore di ARG_MAX
 
se vuoi modificarlo e ricompilare il kernel sta in (o dovrebbe stare in) 
sys/limits.h
 

 in) sys/limits.h
 
Ho ricompilato, non senza difficolta` e dopo un paio di tentativi, il
kernel Linux una sola volta, da niubbo, una quindicina d'anni fa come mi
consigliarono qui, o forse sul newsgroup di RH, e l'idea che mi rimasta
la posso sintetizzare cosi`:
 
ricompilazione kernel == grandissima rottura di @@
 
Fortunatamente non ho questo genere di problemi e quindi non posso fare
delle prove, ma leggendo qui e la` nei miei appunti credo che se dovessi
affrontare grosse moli di file prima di riprovare a compilare un kernel
punterei sul comando find
 
find / -type f -iname '*.avi' -print0 -exec ls {} +
 
o magari disponendo di CPU multicore, anche parallel
 
find / -type f -iname '*.avi' -print0 | parallel -X -0 ls
 
--
"Per orientarti nell'Infinito distinguer devi e poscia unire."
(Johann Wolfgang von Goethe)
 
 

 punterei sul comando find
 
senza contare il fatto che se si ricompila il kernel, il momento che si cambia macchina/distro/kernel, gli script smettono di funzionare di nuovo, mentre ad usare Xargs/find/... si e' sicuri che gli script funzioneranno sempre.
 
Ciao Jack


La mia risposta era solo riguardo ARGV.
Anche io eviterei di ricompilare il kernel, poi con gli aggiornamenti va 
ricompilato ogni volta.
Una rottura
Meglio la classica soluzione con find ..
 


se è una directory sola puoi usare
 
$ locate -n100 .txt | grep /path/della/directory
 
per estrarre i primi 100
 
poi dopo averli elaborati tipo aver creato un file coi ititoli
ls $(locate -n100 .txt | grep /path/della/directory) | grep abcd >> 
elencoTutti
 
 
mv $(locate .txt | grep /path/della/directory) ~/ElaboratiDiOggi
 
e ripeti la prima operazione finchè hai un output di almeno 1 elemento
 
Ah prima di lanciare locate è meglio fare
 
# updatedb
 
in quanto per fare prima locate usa un database e non va a cercarsi i 
file sull'hd, non so quanti -nXXX elementi puoi avere su man non lo 
specifica.

 specifica.
 
cosi a occhio direi ARG_MAX ;)
 
Ciao Jack