Portál AbcLinuxu, 1. června 2025 15:21


Dotaz: porovnani array v BASHi

belisarivs avatar 3.9.2008 15:16 belisarivs | skóre: 22 | blog: Psychobláboly
porovnani array v BASHi
Přečteno: 294×
Odpovědět | Admin
Zdravim.

Potrebuju poradit.

Ucim se s Bashem a potreboval bych jednu vec.

Chci napsat skript, ktery by nakouknul do adresare "&patch", pak by nakouknul do adresare "$source1" a nakonec do adresare "$source2".

Pak by podle nazvu bez pripony vykopiroval vsechny soubory, ktere se nachazeji v adresarich "$source1" a zaroven i "patch", ale ne v "source2".

Zmatlal jsem neco takovehoto. Nevypada to moc pekne, ale snad se v tom bude dat vyznat.
count_patch=1
for i in $patch/*.patch
do
  if [ -f "$i" ]; then
	patch[$count_patch]=$(basename "$i" .patch)
	echo ${patch[$count_patch]}
	((count_patch+=1))
    amount_patch=$count_patch
  fi
done
echo $amount_patch

count_source2=1
for i in $po_kde4_new/*.1
do
  if [ -f "$i" ]; then
	source2[$count_source2]=$(basename "$i" .1)
	echo ${source2[$count_source2]}
	((count_source2+=1))
    amount_source2=$count_source2
  fi
done
echo $amount_source2

count_source1=1
for i in $po_kde3_new/*.1
do
  if [ -f "$i" ]; then
	source1[$count_source1]=$(basename "$i" .1)
	echo ${source1[$count_source1]}
	((count_source1+=1))
    amount_source1=$count_source1
  fi
done

while [ $amount_patch -gt 0 ]
do
  amount_source1=$count_source1
  echo $amount_source1
  while [ $amount_source1 -gt 0 ]
  do
    amount_source1=$count_source1
    if [[ $(echo ${patch[$count_patch]}) = $(echo ${source1[$count_source1]}) ]]; then
      amount_source2=$count_source2
      while [ $amount_source2 -gt 0 ]
      do
	if [[ $(echo ${source1[$count_source1]}) != $(echo ${source2[$count_source2]}) ]]; then
	cp ${source1[$count_source1]}.1 ${patch[$count_patch]}.patch $skladiste    
	fi
	((amount_source2-=1))
      done 
    fi
    ((amount_source1-=1))
  done
  ((amount_patch-=1))
done
Je tam dost chyb.

Mimo jine nevim, jak zajistit aby byla dodrzena podminka, ze soubor o stejnem nazvu nesmi byt v "source2". To co tam mam je vylozene blbe.

Navic mi pri porovnani tech array vraci obe polozky prazdny retezec.

Nemuzete mi poradit, jak to zprovoznit? Pres array to byt nemusi. Jde mi spis o funkcnost a nic lepsiho me nenapadlo.

Dekuju za jakoukoliv radu.
IRC is just multiplayer notepad.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

3.9.2008 16:02 Andrej Herceg | skóre: 43
Rozbalit Rozbalit vše Re: porovnani array v BASHi
Odpovědět | | Sbalit | Link | Blokovat | Admin
Neviem, či je zrovna Bash na niečo takéto najlepší, ale za istých okolností by mohlo fungovať niečo takéto:
#!/bin/sh

PATCH=./patch
SRC1=./src1
SRC2=./src2

IFS=$'\n'

patchs=( $(find "$PATCH" -type f -name "*.patch" -print0 | xargs -0 -n 1 -i basename '{}' .patch ) )
srcs1=( $(find "$SRC1" -type f -name "*.c" -print0 | xargs -0 -n 1 -i basename '{}' .c ) )
srcs2=( $(find "$SRC2" -type f -name "*.c" -print0 | xargs -0 -n 1 -i basename '{}' .c ) )

# echo "${#srcs1[*]}"
# echo "${srcs1[*]}"

# subory, ktore su v SRC1 a aj v SRC2
tmp1=( $(echo -e "${srcs1[*]}\n${srcs2[*]}" | sort | uniq -d) )

# echo "${#tmp1[*]}"
# echo "${tmp1[*]}"

# subory, ktore su v SRC1, ale nie su v SRC2
tmp2=( $(echo -e "${srcs1[*]}\n${tmp1[*]}\n${tmp1[*]}" | sort | uniq -u) )

# echo "${#tmp2[*]}"
# echo "${tmp2[*]}"

# subory, ktore su v PATCH a SRC1
tmp3=( $(echo -e "${patchs[*]}\n${tmp2[*]}" | sort | uniq -d) )

echo "${#tmp3[*]}"
echo "${tmp3[*]}"
belisarivs avatar 3.9.2008 19:40 belisarivs | skóre: 22 | blog: Psychobláboly
Rozbalit Rozbalit vše Re: porovnani array v BASHi
To vypada zajimave. Vyzkousim.

Jenom jedna vec. Ty tri podminky musi platit zaroven.

Proste schci ze src1 vykopcit vse, co je i v patch a neni v src2 a z patch chci vykopcit do toho sameho adresare vse, co je v src1 a neni v src2.

Ale to uz bude asi jenom varianta na to co jsi napsal.

Dekuju moc.
IRC is just multiplayer notepad.
3.9.2008 19:45 Andrej Herceg | skóre: 43
Rozbalit Rozbalit vše Re: porovnani array v BASHi
Presne také súbory by mal vypísať ten príkaz echo "${tmp3[*]}" (teda len názov súboru, ale nie je problém tomu pridať adresár a príponu).

Ja som mal skôr na mysli to, že ak tie názvy súborov budú obsahovať znak "\n", tak to nebude fungovať (a asi si to neporadí ani s veľmi veľkým počtom súborov).
3.9.2008 19:58 Andrej Herceg | skóre: 43
Rozbalit Rozbalit vše Re: porovnani array v BASHi
Upravený výpis by mohol vyzerať takto:
for i in ${tmp3[*]}
do
        echo "$PATCH/$i.patch"
        echo "$SRC1/$i.c"
done
belisarivs avatar 6.9.2008 20:48 belisarivs | skóre: 22 | blog: Psychobláboly
Rozbalit Rozbalit vše Re: porovnani array v BASHi
Dekuju moc. Funguje to.
IRC is just multiplayer notepad.
3.9.2008 23:37 vencas | skóre: 32
Rozbalit Rozbalit vše Re: porovnani array v BASHi
Odpovědět | | Sbalit | Link | Blokovat | Admin
Doporučuju se podívat na základní literaturu; Jamie Zawinski řeší něco podbného na stranách 167--169 ;-)
3.9.2008 23:54 Andrej Herceg | skóre: 43
Rozbalit Rozbalit vše Re: porovnani array v BASHi
To je tá časť, kde namiesto toho, aby sa snažil pochopiť, ako to treba urobiť správne skúša náhodné možnosti až dovtedy, kým to začne fungovať? :)
belisarivs avatar 4.9.2008 10:45 belisarivs | skóre: 22 | blog: Psychobláboly
Rozbalit Rozbalit vše Re: porovnani array v BASHi
To ma byt nejaka parodie nebo co to je?
IRC is just multiplayer notepad.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.