» »

[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
  • spremenilo: snow ()

64202 ::

cat files | while read f; do nekaj_s_fajlom $f; done
I am NaN, I am a free man!

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!

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...)
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 *... :)

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!

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.

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
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.

64202 ::

*enlightened* :D
I am NaN, I am a free man!

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

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

Zgodovina sprememb…

bijonda ::

Hallo!

Evo problem je resen.

Zelim vem lep dan!

Ciao ciao

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 )

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! :O

Se enkrat vsem hvala za pomoc.

Lep dan in vikedn vam zelim.

Ciao ciao

mile ::

jah no, problem glih ni rešen :\

bijonda ::

Na sreco za mene je, zal za vas ni! :D
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?

Zgodovina sprememb…

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

Jean-Paul ::

bijonda, samo da je problem rešen

LP
JPS

mikro ::

Bjonda, a si ti prepricana da ne delas pri katerem GSM operaterju :) ?

Lio ::

bl študentka FMF-ja ;)

BigWhale ::

Sej vseen, slo-tech bi zdaj rad nude & seminude pictures v zahvalo za pomoc... ;>

minjana ::

Hm verjetno je uporabil

for i in *
do
cp $i $wherever
done

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

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}"

mikro ::

no v bodoce ce imas vec kot 999 fajlov v direktoriju (takrat javi args list too long), potem uporabis ukaz
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 ()

minjana ::

Ej Ogo a Testnih fajlov pa ne arhivirate :), al jih mate v drugem diru.

Ginginova ::

Testne fajle zarhiviram na roke.

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. :D :D :D

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)

bijonda ::

Prosim?

Od kje me poznas?
Sem delala, ne vec. Sem dala odpoved, zdaj pa delam v eni manjsi programerski firmi!


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Noob se loti programiranje v BASH

Oddelek: Programiranje
212196 (1596) c3p0
»

[bash]Problem s pomnjenjem pri štetju vrstic

Oddelek: Programiranje
121076 (885) Keki
»

[Naloga][Linux] BASH skripte

Oddelek: Operacijski sistemi
174088 (3617) sverde21
»

[ Linux ] Kako zbrisati določene vrstice iz več fajlov hkrati?

Oddelek: Operacijski sistemi
10928 (831) Brane2
»

Skripte (strani: 1 2 )

Oddelek: Programiranje
508331 (6194) Microsoft

Več podobnih tem