Forum » Programiranje » [UNIX] arg list too long
[UNIX] arg list too long
bijonda ::
Ciao!
Jaz imam en problem. Pisem v unixu skripte, zaganjam pa jih v putty.
Kopiram direktorije z velikim stevilom fileov (cca 9000 mogoce tudi vec). Javi pa se mi napaka pri listaju, arg list too long!
tu mi javi napako:
ls -l $GGSN/collected/GPRS* | cut -d"/" -f10 > $LISTS/FILES_GGSN_collected
Mi lahko kdo pomaga in mi pove kako se da to resiti, ali obstaja kak ukaz?
Hvala za pomoc!
Ciao ciao Bijonda
Jaz imam en problem. Pisem v unixu skripte, zaganjam pa jih v putty.
Kopiram direktorije z velikim stevilom fileov (cca 9000 mogoce tudi vec). Javi pa se mi napaka pri listaju, arg list too long!
tu mi javi napako:
ls -l $GGSN/collected/GPRS* | cut -d"/" -f10 > $LISTS/FILES_GGSN_collected
Mi lahko kdo pomaga in mi pove kako se da to resiti, ali obstaja kak ukaz?
Hvala za pomoc!
Ciao ciao Bijonda
- spremenilo: snow ()
bijonda ::
Sem ze probala, pa ne gre:
Tu je del skripte:
if [ -d $TAPout/proccesed ]
then
$CD $TAPout/proccesed
test=`$LS | wc -l`
if [ $test -eq 0 ]
then
$ECHO "Dir is empty do not do anything" >> $LOG
else
$LS -l $TAPout/proccesed/CD* | $CUT -d"/" -f7 > $LISTS/FILES_TAPout_proccesed
NUMBER_OF_FILES=`$CAT $LISTS/FILES_TAPout_proccesed | wc -l`
$ECHO "$NUMBER_OF_FILES"
# Copping the files to arhiv
# We will copy only the files that were picked up by the list command
# we also create a new list that has only the files that were successfully copyed
$CAT $LISTS/FILES_TAPout_proccesed | while read line
do
$CP $TAPout/proccesed/$line $TAPoutarh/week_$DATUM/proccesed
if [ $? -eq 0 ]
then
$ECHO $line >> $tapout_dat_proccesed
fi
done
# Check if all the files were actually copyed
NUMBER_OF_FILES_TO_BE_COPYED=`$CAT $LISTS/FILES_TAPout_proccesed | wc -l`
NUMBER_OF_FILES_COPY=`$CAT $tapout_dat_proccesed | wc -l`
$ECHO "$NUMBER_OF_FILES_TO_BE_COPYED"
$ECHO "$NUMBER_OF_FILES_COPY"
if [ $NUMBER_OF_FILES_TO_BE_COPYED -eq $NUMBER_OF_FILES_COPY ]
then
$CAT $LISTS/FILES_TAPout_proccesed | while read line
do
#here we remove a list of files that had been copyed
$ECHO "Sum of files match, going to delete the files" >> $LOG
#$RM -f $TAPout/proccesed/$line
if [ $? -eq 0 ]
then
$ECHO "Succesfully deleted the files" >> $LOG
fi
done
fi
fi
fi # za TAPout/proccesed
Ostalo dela kakor treba, samo pri ls se mi zlomi!
Tu je del skripte:
if [ -d $TAPout/proccesed ]
then
$CD $TAPout/proccesed
test=`$LS | wc -l`
if [ $test -eq 0 ]
then
$ECHO "Dir is empty do not do anything" >> $LOG
else
$LS -l $TAPout/proccesed/CD* | $CUT -d"/" -f7 > $LISTS/FILES_TAPout_proccesed
NUMBER_OF_FILES=`$CAT $LISTS/FILES_TAPout_proccesed | wc -l`
$ECHO "$NUMBER_OF_FILES"
# Copping the files to arhiv
# We will copy only the files that were picked up by the list command
# we also create a new list that has only the files that were successfully copyed
$CAT $LISTS/FILES_TAPout_proccesed | while read line
do
$CP $TAPout/proccesed/$line $TAPoutarh/week_$DATUM/proccesed
if [ $? -eq 0 ]
then
$ECHO $line >> $tapout_dat_proccesed
fi
done
# Check if all the files were actually copyed
NUMBER_OF_FILES_TO_BE_COPYED=`$CAT $LISTS/FILES_TAPout_proccesed | wc -l`
NUMBER_OF_FILES_COPY=`$CAT $tapout_dat_proccesed | wc -l`
$ECHO "$NUMBER_OF_FILES_TO_BE_COPYED"
$ECHO "$NUMBER_OF_FILES_COPY"
if [ $NUMBER_OF_FILES_TO_BE_COPYED -eq $NUMBER_OF_FILES_COPY ]
then
$CAT $LISTS/FILES_TAPout_proccesed | while read line
do
#here we remove a list of files that had been copyed
$ECHO "Sum of files match, going to delete the files" >> $LOG
#$RM -f $TAPout/proccesed/$line
if [ $? -eq 0 ]
then
$ECHO "Succesfully deleted the files" >> $LOG
fi
done
fi
fi
fi # za TAPout/proccesed
Ostalo dela kakor treba, samo pri ls se mi zlomi!
64202 ::
Ah ja, narobe prebral, namesto ls -l daj tole:
find $GGSN/collected/ -maxdepth 1 -name 'GPRS*'
(pa mogoce je treba se kaj pohekat, da bo taprav output...)
find $GGSN/collected/ -maxdepth 1 -name 'GPRS*'
(pa mogoce je treba se kaj pohekat, da bo taprav output...)
I am NaN, I am a free man!
Zgodovina sprememb…
- spremenilo: 64202 ()
BigWhale ::
Uporabi xargs
PS: ls -l lahko vrne precej nepredvidljiv rezultat, sploh ce ga uporabljas v kombinaciji z *... :)
PS: ls -l lahko vrne precej nepredvidljiv rezultat, sploh ce ga uporabljas v kombinaciji z *... :)
Zgodovina sprememb…
- spremenil: BigWhale ()
bijonda ::
Zal ni slo z xargs! Lahko se zgodi da ga nisem postavila na pravo mesto!
Imas se kdo kako idejo!
Hvala za vse!
Imas se kdo kako idejo!
Hvala za vse!
64202 ::
Tisto s find more delat! xargs ma pa isti problem kot ls, ce kaj vem
I am NaN, I am a free man!
BigWhale ::
Hm, xargs je ravno zato, da iz parametrov, ki jih dobi po stdin naredi vec ukazov...
Tukaj se mi zdi, da imas drug problem. Ce prav vidim tvojo skripto, bi rada iz nekega direktorija dobila ven seznam datotek in potem nekaj naredila z njimi.
Problem je v tem, da ti ls -l poleg seznamov datotek vrne se marsikaj drugega. Odvisno tudi od sistema, poleg tega, ce je kje kak direktorij, bo sel ls notri in tam zlistal seznam datotek. Te datoteke bodo pa brez prave poti.
Seznam datotek iz trenutnega direktorija, brez njihove poti in brez da se spuscas v druge direktorije, dobis najlazje z:
find ./ -maxdepth 1 -type f -exec basename {} \;
PS: Dodal sem se -type f, da ti zlista samo datoteke.
Tukaj se mi zdi, da imas drug problem. Ce prav vidim tvojo skripto, bi rada iz nekega direktorija dobila ven seznam datotek in potem nekaj naredila z njimi.
Problem je v tem, da ti ls -l poleg seznamov datotek vrne se marsikaj drugega. Odvisno tudi od sistema, poleg tega, ce je kje kak direktorij, bo sel ls notri in tam zlistal seznam datotek. Te datoteke bodo pa brez prave poti.
Seznam datotek iz trenutnega direktorija, brez njihove poti in brez da se spuscas v druge direktorije, dobis najlazje z:
find ./ -maxdepth 1 -type f -exec basename {} \;
PS: Dodal sem se -type f, da ti zlista samo datoteke.
Zgodovina sprememb…
- spremenil: BigWhale ()
64202 ::
> Hm, xargs je ravno zato, da iz parametrov, ki jih dobi po stdin naredi vec ukazov...
To clo pise v man page-u, samo meni to dela tako, da v argumente stlaci!? wtf
To clo pise v man page-u, samo meni to dela tako, da v argumente stlaci!? wtf
x.sh: #! /bin/sh echo "$@" >> /tmp/xx
> echo -en "1\n2\n3\n" | xargs ./x.sh > cat /tmp/xx 1 2 3 >
I am NaN, I am a free man!
BigWhale ::
Ja, saj to nardi ampak, ce imas ti 30000 argumentov, bo on stvar tako porazdelil, da bo vsakic, ko bo zagnal program uporabil maximalno stevilo argumentov oziroma toliko kot mu jih ti specificiras...
Se pravi, ce das cp * lalala in imas 30000 filetkov in to naredis z xargs, bo xargs cp pognal tolikokrat, da bo vse skopiral.
Se pravi, ce das cp * lalala in imas 30000 filetkov in to naredis z xargs, bo xargs cp pognal tolikokrat, da bo vse skopiral.
bijonda ::
Fantje, hvala za vse samo zal danes ne morem probati niti en predlog ki ste mi ga dali, ker nam ne dela server in ne morm nic delati!
Da vsaj malo razlozim kaj na bi delala moja skripta. Iz direktorija moram prebrai vse file in jih skopirati v drug direktori, nato pa moram te file iz prvotnega direktorija zbrisat, ker v cca enem tednu pridejo novi file-i, ki jih treba skopirat v drugi direktori.
Sem hotla narediti s cp* pa mi mentor ni pustil, kao ne bi delalo kot treba in mi ne bi kopiral samo tiste file ki bi jih rabili! On je sef in delam tko kot on pravi!
Hvala za vse predloge in ce dobite se kakega bom zelo vesela in hvalezna!
Ciao ciao
Da vsaj malo razlozim kaj na bi delala moja skripta. Iz direktorija moram prebrai vse file in jih skopirati v drug direktori, nato pa moram te file iz prvotnega direktorija zbrisat, ker v cca enem tednu pridejo novi file-i, ki jih treba skopirat v drugi direktori.
Sem hotla narediti s cp* pa mi mentor ni pustil, kao ne bi delalo kot treba in mi ne bi kopiral samo tiste file ki bi jih rabili! On je sef in delam tko kot on pravi!
Hvala za vse predloge in ce dobite se kakega bom zelo vesela in hvalezna!
Ciao ciao
Jean-Paul ::
Bi slo tako?
mv old_dir new_dir
mkdir old_dir
Drugace pa kombinacija tistega, kar sta predlagala 64202 in BigWhale.
find ./ -maxdepth 1 -type f -exec basename {} \; |while read file; do cp $file aaa/; done
mv old_dir new_dir
mkdir old_dir
Drugace pa kombinacija tistega, kar sta predlagala 64202 in BigWhale.
find ./ -maxdepth 1 -type f -exec basename {} \; |while read file; do cp $file aaa/; done
Zgodovina sprememb…
- spremenil: Jean-Paul ()
BigWhale ::
Ja, hudirja!
Povej kako, da bodo se drugi imeli kaj od tega! ;)
(BW, v upanju, da kdo pogleda stare poste, ko naleti na problem :P )
Povej kako, da bodo se drugi imeli kaj od tega! ;)
(BW, v upanju, da kdo pogleda stare poste, ko naleti na problem :P )
bijonda ::
Hallo!
Najprej hvala vsem za pomoc! Sem pozabila prej napisat!
Ej resitev vam ne bo vsec. Mentor je rocno prenesel stare file iz direktorijev, tako da mi je v direktoriju ostalo cca 6k filov. Program pa je za tako stevilo delal, kot sem ga jaz napisala.
Zelo mi je zal, da vam nisem mogla dati resitev za tak problem, ker predpostavljam da nas kar dosti naleti na tako tezavo!
Se enkrat vsem hvala za pomoc.
Lep dan in vikedn vam zelim.
Ciao ciao
Najprej hvala vsem za pomoc! Sem pozabila prej napisat!
Ej resitev vam ne bo vsec. Mentor je rocno prenesel stare file iz direktorijev, tako da mi je v direktoriju ostalo cca 6k filov. Program pa je za tako stevilo delal, kot sem ga jaz napisala.
Zelo mi je zal, da vam nisem mogla dati resitev za tak problem, ker predpostavljam da nas kar dosti naleti na tako tezavo!
Se enkrat vsem hvala za pomoc.
Lep dan in vikedn vam zelim.
Ciao ciao
bijonda ::
Na sreco za mene je, zal za vas ni!
Naj se nikoli ne bi zgodilo, da bi imela v direktoriju vec kot 8k fileov. Moji programi pa lepo delajo do cca 16k -20k fileov!
Za mene je problem resen.
Kot sem enkrat prej napisala, mentor je moj sef, sef pa ima vedno prou.
Ciao ciao
Naj se nikoli ne bi zgodilo, da bi imela v direktoriju vec kot 8k fileov. Moji programi pa lepo delajo do cca 16k -20k fileov!
Za mene je problem resen.
Kot sem enkrat prej napisala, mentor je moj sef, sef pa ima vedno prou.
Ciao ciao
Jean-Paul ::
In kaj je razlog za tako omejitev?
16k - 20k ???
Svašta.
Kako misliš ročno?
16k - 20k ???
Svašta.
Kako misliš ročno?
Zgodovina sprememb…
- spremenil: Jean-Paul ()
bijonda ::
NE vem katere tocno ukaze je uporabil. Jih je pac prenesel, da so lahko moje skripte delale!
Sej je gor na server in jih prenesel!
Vec vem ne morem povedati, ker se tudi meni vec ne sanja kaj je tocno naredil!
LP Bijonda
Sej je gor na server in jih prenesel!
Vec vem ne morem povedati, ker se tudi meni vec ne sanja kaj je tocno naredil!
LP Bijonda
Ginginova ::
Jep, for loop je v Shellu sicer hudo počasen, vendar ko imaš ziljone fajlov je fina rešitev, pa čeprav počasna.
recimo, ko failne:
mv BLA* /drug_folder
dela:
for i in BLA*
do mv $i /drug_folder
done
Je pa ta prva varijanta definitivno hitrejša in to precej precej hitrejša po času procesiranja.
Jaz recimo uporabljam za določena arhiviranja ziljona fajlov varijanto v stilu:
cd $TAP3_IN_DIR
echo 'Archiving TAP3 input files'
for i in CD*
do
cp -p $i $TAP3_IN_BAK_DIR
zip -9 -m $TAP3_IN_ZIP $i
done
Ogo
recimo, ko failne:
mv BLA* /drug_folder
dela:
for i in BLA*
do mv $i /drug_folder
done
Je pa ta prva varijanta definitivno hitrejša in to precej precej hitrejša po času procesiranja.
Jaz recimo uporabljam za določena arhiviranja ziljona fajlov varijanto v stilu:
cd $TAP3_IN_DIR
echo 'Archiving TAP3 input files'
for i in CD*
do
cp -p $i $TAP3_IN_BAK_DIR
zip -9 -m $TAP3_IN_ZIP $i
done
Ogo
BigWhale ::
tisti mv $i crkne ob prvem filetku, ki ima v imenu presledek ali kak drug cuden znak... :)
Bolj je varna, ce uporabis:
mv "${i}"
Bolj je varna, ce uporabis:
mv "${i}"
mikro ::
no v bodoce ce imas vec kot 999 fajlov v direktoriju (takrat javi args list too long), potem uporabis ukaz
find .... -exec ....
find .... -exec ....
minjana ::
Glede arg list to long, npr. na moji masini imam lahko 27932 fajlov in sele na 27933 se pojavi, tko da to je cisto odvisno od serverja.
Zgodovina sprememb…
- spremenilo: minjana ()
Ginginova ::
Testne fajle zarhiviram na roke.
Sicer pa bom kmalu itak primoran napravit:
rm -rf /Vega
Ogo
Sicer pa bom kmalu itak primoran napravit:
rm -rf /Vega
Ogo
veteran ::
Ogo >> Jep, for loop je v Shellu sicer hudo počasen
Sama for zanka niti ne, počasno je to, da recimo 10000-krat požene mv ali cp. Če pa v zanki npr samo prešteješ in izpišeš datoteke, je zadeva čisto spodobna. ;)
Sicer pa xargs, kot je že BW omenil. Npr:
find *.txt -type f -maxdepth 0 | xargs cp -v --target-directory=/nekje/dir/
BigWhale >> slo-tech bi zdaj rad nude & seminude pictures v zahvalo za pomoc... ;>
Yes! Tale predlog obvezno takoj dodati v slo-tech pravila.
Sama for zanka niti ne, počasno je to, da recimo 10000-krat požene mv ali cp. Če pa v zanki npr samo prešteješ in izpišeš datoteke, je zadeva čisto spodobna. ;)
Sicer pa xargs, kot je že BW omenil. Npr:
find *.txt -type f -maxdepth 0 | xargs cp -v --target-directory=/nekje/dir/
BigWhale >> slo-tech bi zdaj rad nude & seminude pictures v zahvalo za pomoc... ;>
Yes! Tale predlog obvezno takoj dodati v slo-tech pravila.
veteran ::
še tole - pri find je dobro dodati parameter -print0, pri xargs pa -0
(sicer presledki v imenih naredijo štalo, s temle pa so imena v seznamu ločena z \0)
(sicer presledki v imenih naredijo štalo, s temle pa so imena v seznamu ločena z \0)
bijonda ::
Prosim?
Od kje me poznas?
Sem delala, ne vec. Sem dala odpoved, zdaj pa delam v eni manjsi programerski firmi!
Od kje me poznas?
Sem delala, ne vec. Sem dala odpoved, zdaj pa delam v eni manjsi programerski firmi!
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Noob se loti programiranje v BASHOddelek: Programiranje | 2275 (1675) | c3p0 |
» | [bash]Problem s pomnjenjem pri štetju vrsticOddelek: Programiranje | 1131 (940) | Keki |
» | [Naloga][Linux] BASH skripteOddelek: Operacijski sistemi | 4218 (3747) | sverde21 |
» | [ Linux ] Kako zbrisati določene vrstice iz več fajlov hkrati?Oddelek: Operacijski sistemi | 986 (889) | Brane2 |
» | Skripte (strani: 1 2 )Oddelek: Programiranje | 8852 (6715) | Microsoft |