Hirdetés

2024. április 24., szerda

Gyorskeresés

Hozzászólások

(#2601) KrAt válasza Keem1 (#2599) üzenetére


KrAt
veterán

ha bash -x ./script.sh előtaggal futtatod, akkor látjuk, milyen értéket vesz fel, próbáld úgy

(#2602) Keem1 válasza bambano (#2600) üzenetére


Keem1
addikt

++ hostname
+ devicename=pistacio
+ path_backup=/media/hdd/backup
+ file_archive=pistacio.local.tar.gz
+ path_archive=/media/hdd/backup/pistacio.local.tar.gz
+ [[ ! -d /media/hdd/backup ]]
+ [[ -f /media/hdd/backup/pistacio.local.tar.gz ]]
+ rm -f /media/hdd/backup/pistacio.local.tar.gz
+ [[ -f '' ]]
+ directories=("/home/juliska/")
+ declare -a directories
+ excludes=("home/juliska/tmp")
+ declare -a excludes
++ printf '%s\n' /home/juliska/
+ dirlist=/home/juliska/
++ printf -- '--exclude='\''%s'\'' ' home/juliska/tmp
+ exclist='--exclude='\''home/juliska/tmp'\'' '
+ tar -cvf /media/hdd/backup/pistacio.local.tar.gz '--exclude='\''home/juliska/tmp'\''' /home/juliska/
tar: A kezdő „/” eltávolítása a nevek elejéről
/home/juliska/
/home/juliska/.bash_history
/home/juliska/samsung_860evo_250gb_01.png
/home/juliska/samsung_860evo_250gb_02.png
/home/juliska/samsung_860evo_250gb_03.png
/home/juliska/.bash_logout
/home/juliska/tmp/
/home/juliska/tmp/teszt.txt
/home/juliska/tmp/addon.xml
/home/juliska/tmp/131927106_711033053173709_564839630427467469_n_711033049840376.jpg
/home/juliska/tmp/20210117_201722.jpg
/home/juliska/backup.sh
/home/juliska/.profile
/home/juliska/.bashrc

[ Szerkesztve ]

(#2603) KrAt válasza Keem1 (#2602) üzenetére


KrAt
veterán

+ excludes=("home/juliska/tmp")

tar parancsban '--exclude='\''home/juliska/tmp'\'''

Ez nekem nem tetszik

[ Szerkesztve ]

(#2604) bambano válasza Keem1 (#2602) üzenetére


bambano
titán
LOGOUT blog

a printf-nél szerintem felesleges az aposztróf, az idézőjel meg az eszképelés.
szerintem
printf '--exclude %s' home/juliska/tmp

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#2605) Keem1 válasza bambano (#2604) üzenetére


Keem1
addikt

Sajnos úgy se megy :U Viszont így kicsit necces, ha később kerül be olyan folder, aminek a nevében space van.

juliska@pistacio:~ $ bash -x ./backup.sh
++ hostname
+ devicename=pistacio
+ path_backup=/media/hdd/backup
+ file_archive=pistacio.local.tar.gz
+ path_archive=/media/hdd/backup/pistacio.local.tar.gz
+ [[ ! -d /media/hdd/backup ]]
+ [[ -f /media/hdd/backup/pistacio.local.tar.gz ]]
+ rm -f /media/hdd/backup/pistacio.local.tar.gz
+ [[ -f '' ]]
+ directories=("/home/juliska/")
+ declare -a directories
+ excludes=("home/juliska/tmp")
+ declare -a excludes
++ printf '%s\n' /home/juliska/
+ dirlist=/home/juliska/
++ printf --exclude=%s home/juliska/tmp
./backup.sh: 32. sor: printf: --: érvénytelen kapcsoló
printf: használat: printf [-v változó] formátum [argumentumok]
+ exclist=
+ tar -cvf /media/hdd/backup/pistacio.local.tar.gz /home/juliska/
tar: A kezdő „/” eltávolítása a nevek elejéről
/home/juliska/
/home/juliska/.bash_history
/home/juliska/samsung_860evo_250gb_01.png
/home/juliska/samsung_860evo_250gb_02.png
/home/juliska/samsung_860evo_250gb_03.png
/home/juliska/.bash_logout
/home/juliska/tmp/
/home/juliska/tmp/teszt.txt
/home/juliska/tmp/addon.xml
/home/juliska/tmp/131927106_711033053173709_564839630427467469_n_711033049840376.jpg
/home/juliska/tmp/20210117_201722.jpg
/home/juliska/backup.sh
/home/juliska/.profile
/home/juliska/.bashrc
juliska@pistacio:~ $

(#2606) bambano válasza Keem1 (#2605) üzenetére


bambano
titán
LOGOUT blog

mert kimaradt a printf-ből a --, ezért nem rakta bele az exclude listet.
azt még egy kicsit agyalnom kell, hogy mikor melyik expansion zajlik le...

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#2607) Keem1 válasza bambano (#2606) üzenetére


Keem1
addikt

Így jó :C

exclist=$(printf -- "--exclude=%s\n" "${excludes[@]}")

Ez most remekül működik, igaz, azonnal bukom az egészet, ha bekerül egy space-t tartalmazó path, de egyelőre ilyenem nincs.

Köszönöm srácok a segítséget és a türelmet :R

(#2608) bambano válasza Keem1 (#2607) üzenetére


bambano
titán
LOGOUT blog

azt majd beírod kérdőjellel.

ez?egy?space?pelda

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#2609) Fecogame


Fecogame
veterán

Szeretnék létrehozni egy olyan (valószínűleg) tömböt, ami x számú elemet tartalmazhat, és ha a limiten felül hozzáadok egy újat, akkor a a legrégebben hozzáadott kiesik belőle.

Létezik ilyen? Ha igen, mi a neve?

Példa 3 tagú tömbre:

Ujelem1
Ujelem2
Ujelem3

Majd ha hozzáadom az Ujelem4-et, és így nézne ki:

Ujelem2
Ujelem3
Ujelem4

Most egy fájlba irányítom ezeket az elemeket és onnan szűrök rá tail-el, de rendkívül lassú módszer így.

Lassú a mobilinterneted? 4G/LTE antennák, közvetlenül raktárról ---> http://bit.ly/LTE_Antennak

(#2610) dabadab válasza Fecogame (#2609) üzenetére


dabadab
titán

Nincs ilyen, kézzel lehet szabályozgatni a tömböt:

#!/bin/bash

declare -a ARR
MAXLEN=4

function add_element()
{
ARR+=("$1")
len=${#ARR[@]}
if [ $len -gt $MAXLEN ] ; then
local -a tmp_arr
local i=$((len-$MAXLEN))
while [ $i -lt $len ] ; do
tmp_arr+=(${ARR[$i]})
let i++
done
ARR=(${tmp_arr[@]})
fi
}


for x in $(seq 8) ; do
add_element $x
echo ${ARR[@]}
done

DRM is theft

(#2611) Fecogame válasza dabadab (#2610) üzenetére


Fecogame
veterán

Köszi, működik! :) Mindenesetre furcsa, hogy alapból a shell-ben nincs ilyen funkció.

[ Szerkesztve ]

Lassú a mobilinterneted? 4G/LTE antennák, közvetlenül raktárról ---> http://bit.ly/LTE_Antennak

(#2612) _kovi_


_kovi_
aktív tag

Sziasztok!
Ez lenne a kérdésem, hogy másik topicban kolléga említette, hogy a fordított aposztróf idejétmúlt, mert a processzbehelyettesítés régi módszere a fordított aposztróf volt, az új pedig a $( ).
Tehát a fordított aposztrófban egy parancsot lehetett futtatni egyben?
Köszi

(#2613) Fecogame válasza _kovi_ (#2612) üzenetére


Fecogame
veterán

Egy kis magyarázat erre

Egyébként van egy remek tool, ShellCheck, online megnézhető mit lehet javítani a kódban :)

Lassú a mobilinterneted? 4G/LTE antennák, közvetlenül raktárról ---> http://bit.ly/LTE_Antennak

(#2614) _kovi_ válasza Fecogame (#2613) üzenetére


_kovi_
aktív tag

Köszi! :) :R

(#2615) Véreshurka


Véreshurka
senior tag

Sziasztok!

Szeretnék egy olyan script-et készíteni, ami belép egy adott mappába, ott ellenőrzi, hogy megvannak-e bizonyos könyvtárak (egy eredeti, és egy .bac formátumba mentett), majd ezeket rsync-el szinkronizálja. Azt megtaláltam, hogy az eredetit a .bac formátumos mentéssel hogyan tudom megcsinálni, de mivel sosem csináltam még ilyet ott elakadtam, hogy hogyan kellene ennek kinéznie ha több könyvtárat szeretnék szinkronizálni, ebben kérném a segítségeteket.

Így nézne ki a könyvtárszerkezet ha ls-el listázom:

ls mappa/mappa1/mappa2/
mappa3
mappa3.bac
mappa4
mappa4.bac
mappa5
mappa5.bac

És így nézne ki a script ha egy mappát kszinkronizálnék:

#!/bin/sh
cd /mappa/mappa1/mappa2
if test -d mappa3;then
if test -d mappa3.bac;then
rsync -a --delete mappa3/ mappa3.bac/
fi;fi

Ezt szeretném kiegészíteni a többi mappával is. Gondolom amikor megnézetem vele, hogy megvannak-e a mappák, azt csak simán beteszem a script-be, mint a mappa3-nál, de nem tudom mit kellene az első rsync-es sor után tennem, hogy a többi mappát is ugyanúgy leszinkronizálja. Ott is a ;then-t kellene használnom? Valahogy így?

#!/bin/sh
cd /mappa/mappa1/mappa2
if test -d mappa3;then
if test -d mappa3.bac;then
if test -d mappa4;then
if test -d mappa4.bac;then
if test -d mappa5;then
if test -d mappa5.bac;then
rsync -a --delete mappa3/ mappa3.bac/;then
rsync -a --delete mappa4/ mappa4.bac/;then
rsync -a --delete mappa5/ mappa5.bac/
fi;fi

Előre is köszönöm a segtséget!

El Psy Kongroo

(#2616) lev258 válasza Véreshurka (#2615) üzenetére


lev258
veterán

Az rsync-hez nem igazán értek, de jelenleg az if használatod jobban zavar. Logikailag nem értem a dolgot.

Ubuntu MATE 20.04, hobbi cayenne termesztő

(#2617) Véreshurka válasza lev258 (#2616) üzenetére


Véreshurka
senior tag

Én az egészhez nem értek :) . Tulajdonképpen a firefox profil mappáimat szeretném a tmpfs-be helyezni és az lenne a cél, hogy a mentett mappák tartalmát mindig visszamásolja az eredeti profil mappába egy újraindítás után. Ebből a script-ből készítenék majd egy systemd service-t ami minden újraindítás után lefutna a háttérben. Egy mappával egyébként működik a dolog, kipróbáltam egy futtatással miután létrehoztam a scriptet és változott a profil mappa módosítási dátuma, szóval gondolom végrehajtódott a feladat. De mivel több profilt is használok firefox alatt így nem szeretnék minden egyes profil szimkronizációhoz külön service-t készíteni hanem egy service-be belerakni az egészet, a későbiekben pedig ha bővülnének a profiljaim akkor csak a scriptet kellene bővítenem. Innen vettem az ötletet és a script-et: [link]

El Psy Kongroo

(#2618) bambano válasza Véreshurka (#2615) üzenetére


bambano
titán
LOGOUT blog

kb. ezt kellene:

for i in mappa3 mappa4 mappa5; do
[ test -d $i ] && [ test -d "${i}.bac" ] && rsync -a --delete $i "${i}.bac"
done

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#2619) lev258 válasza Véreshurka (#2617) üzenetére


lev258
veterán

Először is, minden if-hez tartozik egy fi. Ez zárja le. Ha egymás után több if van, illetve a végén több fi, akkor az egybeágyazást jelent, vagyis a legbelső if többszörös feltételrendszernek kell, hogy megfeleljen.
Javaslom, hogy kezdd a shell script-ek if használatának megismerésével. Utána az rsync rész már könnyű lesz.

Ubuntu MATE 20.04, hobbi cayenne termesztő

(#2620) Véreshurka válasza lev258 (#2619) üzenetére


Véreshurka
senior tag

Tudsz ajánlani kezdőknek szóló oldalt a script-ekről?

El Psy Kongroo

(#2621) Véreshurka válasza bambano (#2618) üzenetére


Véreshurka
senior tag

Köszönöm!

Csak hogy világos legyen számomra:
a for i kezdéssel határozod meg hogy a ${i} jelentse az összes in utáni mappát? Ha igen akkor mndig csak ki kell egészítenem az in utáni részt azokkal a mappákkal amiket még szeretnék szinkronizáltatni? Illetve gondolom ugyanúgy az elejére kell tennem, hogy belépjen a mappákat tartalmazó szülőmappába? Tehát így nézne ki:

#!/bin/sh
cd /mappa/mappa1/mappa2
for i in mappa3 mappa4 mappa5; do
[ test -d $i ] && [ test -d "${i}.bac" ] && rsync -a --delete $i "${i}.bac"
done

El Psy Kongroo

(#2622) dabadab válasza Véreshurka (#2615) üzenetére


dabadab
titán

Szerintem te nem ezt akarod :)

Ez csak akkor szinkronizálja bármelyik könyvtárat is, ha az összes ott van meg a .bac párja is - én azt gondolnám, hogy igazából az lenne a kívánt működés, hogy ha ott van egy könyvtár meg .bac párja, akkor azt szinkronizálja, függetlenül a többi könyvtártól.

Ennek szellemében:

function do_backup()
{
for DIR in "$@" ; do
BAC="$DIR.bac"
if [ -d "$DIR" ] && [ -d "$BAC" ] ; then
rsync -a --delete "$DIR" "$BAC"
fi
done
}


DIRS=("foo" "bar" "foo bar")
do_backup "${DIRS[@]}"

do_backup "foo" "bar" "foo bar"

do_backup /backup/dirs/*

A három do_backup csak szemléltetésnek van (az első egy arrayban tárolja a szinkronizálandó könyvtárak neveit, a második simán felsorolja, a harmadik meg az adott helyen lévő könyvtárakat használja)

[ Szerkesztve ]

DRM is theft

(#2623) Véreshurka válasza dabadab (#2622) üzenetére


Véreshurka
senior tag

Köszi neked is!

Úgy látom egyelőre maradok annál, hogy egyesével létrehozok egy-egy service fájlt aztán majd kicsit belenézek a script írásba, mert most már végképp bennt vagyok az erdőben...

El Psy Kongroo

(#2624) Sonja


Sonja
veterán

Ubuntu alatt használtam ezt a scriptet, minden probléma nélkül:

find . -maxdepth 1 -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" | xargs -l -i convert -resize 1000x1000\> {} folder.jpg

Most viszont Arch alatt feldob egy ilyen warningot (gondolom, mert újabb verzió a xargs):

xargs: warning: options --max-lines and --replace/-I/-i are mutually exclusive, ignoring previous --max-lines value

Persze így is működik a script, de zavar ez a warning kiírás. Mit kellene tennem, hogy ez ne legyen? :F

Ha csalódni akarsz, bízz az emberekben!

(#2625) dabadab válasza Sonja (#2624) üzenetére


dabadab
titán

Azt, amit mond: vedd ki az xargs mögül a -l-t, mert az nem csinál semmit.

DRM is theft

(#2626) _kovi_


_kovi_
aktív tag

Sziasztok!
Fájlnévre illeszkedést milyen paranccsal tudom vizsgálni egy scriptben?
AWK? SED ?
Köszi! :)

(#2627) Sonja válasza dabadab (#2625) üzenetére


Sonja
veterán

Köszi! :R

Ha csalódni akarsz, bízz az emberekben!

(#2628) Jester01 válasza _kovi_ (#2626) üzenetére


Jester01
veterán

Milyen illeszkedést? Shell pattern glob? Milyen shell?
bash esetén [[ és = operátor. Például:

$ [[ "file1.txt" = f*.txt ]] && echo YES || echo NO
YES
$ [[ "file1.jpg" = f*.txt ]] && echo YES || echo NO
NO

Jester

(#2629) _kovi_ válasza Jester01 (#2628) üzenetére


_kovi_
aktív tag

Bash script.
Most kicsit csúnyán van a fájl kiválasztása, mert adott egy gép ami 4 féle "kiterjesztésű" fájlt ad minden nap végén, de ebből csak az egyik kell nekem. A fájl eleje megegyezik.
Pl.: 1234567.ser , 1234567.tpl , 1234567.chz.tic , 1234567.gpw
Nekem csak a gpw fájlt kellene átmásolnom ami csak azon napon keletkezett. Ez egy windows megosztáson van amit felcsatolok egy mappába a linux szerveren. S onnan másolnék.
Ez a megoldás kicsit csúnya:
gpwfile=$(ls -l --time-style=+%F | grep $(date +%F) | grep -v ".ser" | grep -v ".tpl" | grep -v ".chz.tic" | cut -d" "-f8)

Olyan illeszkedésre gondoltam ami megmondja, hogy a .gwz "végű" fájlt másold át ami aznap keletkezett..

[ Szerkesztve ]

(#2630) bambano válasza _kovi_ (#2629) üzenetére


bambano
titán
LOGOUT blog

gpwfile=$(date '+%F.gwz')

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#2631) dabadab válasza _kovi_ (#2629) üzenetére


dabadab
titán

find /windows_share/ -type f -ctime -1 -iname '*gzw' -exec cp {} /linux_dir/ \;

Balról jobbra olvasva: megkeresi a /windows_share könyvtárban azokat a sima file-okat (tehát könyvtárat, pipe-ot, egyéb speciális file-t nem fog visszaadni), amiket maximum 1*24 órával ezelőtt hoztak létre és (figyelmen kívül hagyva a kis/nagybetű különbségeket) a '*.gzw' wildcardra illeszkednek és végrehajt rajtuk egy másolást a /linux_dir/-be.

DRM is theft

(#2632) bambano válasza dabadab (#2631) üzenetére


bambano
titán
LOGOUT blog

az agyhalott windows userek kedvéért soha nem felejtkezünk el a szóközöket tartalmazó fájlnevekről...

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#2633) dabadab válasza bambano (#2632) üzenetére


dabadab
titán

A {} megoldja a különleges karaktereket problémáját. (És a szóköz (sőt, a \n, \t, \r, stb) teljesen legális karakter a filenevekben, nem kell hozzájuk se agyhalottnak, se windows usernek lenni)

DRM is theft

(#2634) _kovi_


_kovi_
aktív tag

dabadab és bambano köszönöm mindkettőtöknek! :R

(#2635) _kovi_


_kovi_
aktív tag

Egy kis ssegítséget kérnék, sziasztok!

files=$(find /home/butor/ -type f -ctime -1 -iname '*.jpg' | cut -d"/" -f6)
cd /home/butor/
for i in "${files[@]}"
do
    echo $i
done

A files (tömb?)-ben kettő fájl van: fajl1.jpg fajl2.jpg
Szóközzel elválasztva.
Viszont a for nem kezeli külön, hanem egyben! kiírásnál az $i változóra: fajl1.jpg fajl2.jpg

Miért nem kezeli külön, hogy végigmegy az elemeken?

Köszi! :)

[ Szerkesztve ]

(#2636) dabadab válasza _kovi_ (#2635) üzenetére


dabadab
titán

Mert nem tömb, hanem egy string, aminek az elemei hiába vannak space-szel elválasztva, mivel idézőjelek között van, ezért nem bontja fel több stringre, hanem egyetlenként kezeli.

Ha kiveszed az idézőjeleket a fornál (meg a tömbös kezelést, ami mondjuk a működésbe nem zavar be, csak felesleges és megtévesztően néz ki), akkor menni fog - feltéve, hogy nincsenek olyan file-jaid, amiknek a nevében space van.

DRM is theft

(#2637) _kovi_ válasza dabadab (#2636) üzenetére


_kovi_
aktív tag

Bakker :W

Köszönöm! :R

(#2638) bambano válasza dabadab (#2636) üzenetére


bambano
titán
LOGOUT blog

mintha azt mondta volna itten egy szkript titán, hogy a space-es fájlnevekhez nem kell agyhalottnak lenni, mert tökre szabályos meg minden...
:P

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#2639) bambano válasza _kovi_ (#2635) üzenetére


bambano
titán
LOGOUT blog

ezt nem akarod esetleg vagy megírni rendesen, vagy elmondani, hogy mi a cél, és akkor megírjuk rendesen?

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#2640) dabadab válasza bambano (#2638) üzenetére


dabadab
titán

Az, és egy korrekten megírt scriptnek kezelnie is kellene, de nekem úgy tűnt, hogy itt az igény inkább az lenne, hogy gyorsan össze lehessen dobni valamit, ami működik.

DRM is theft

(#2641) _kovi_ válasza bambano (#2639) üzenetére


_kovi_
aktív tag

De megírom persze.
Az a cél, hogy egy gépen(Win7) 1 nap alatt létrejön 4db ugyanolyan fájlnevű de más kiterjesztésű fájl.
A célom az, hogy a script minden nap elmásolja ezt a fájlt. Ebből nekem csak a jpg kell.
Ez egy Win7 megosztáson van, amit felcsatolok Centos7 alá. Majd a scriptben sima cp.
A for azért kellett, mert néha lehet egy nap 2-3 fájl is. De én balga stringként akartam ugye kezelni egy tömböt... :B

(#2642) bambano válasza _kovi_ (#2641) üzenetére


bambano
titán
LOGOUT blog

oké, de például a cut -f 6 -d /  az messziről első ránézésre úgy néz ki, mintha egy olyan valaki akarná a könyvtárnevet levágni a fájlnévről, aki nem ismeri a basename utasítást. ez nekem azt mutatja, hogy volna mit optimalizálni a történeten :)

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#2643) _kovi_ válasza bambano (#2642) üzenetére


_kovi_
aktív tag

Ti PROFIK vagytok, én még tanulom... De rajta vagyok... ;)

(#2644) _kovi_


_kovi_
aktív tag

Srácok, ha egy script lefut manuálisan, csak "apró" hibát dob vissza, hogy pl nincs ilyen könyvtár a move parancsnak(előtte már elmásolta).
Akkor lehet hogy nem futtatja meg a crontab?
Hol tudom megnézni, hogy a cron mit futtatott és sikeresen -e?
Köszönöm! :)

(#2645) Headless válasza _kovi_ (#2644) üzenetére


Headless
őstag

szia hiba kezelést neked kell beraknod.

alapvetően ha szintaktikai hiba nincs a scriptben és semmi hiba kezelés sincs általad, akkor minden lefut.

cron logolást tudsz beállítani, de ez specifikusabb, pl systemd esetében szerintem alapból lesz, de tényleg itt attól függ milyen op rendszer/indítást használ az eszköz.

LEDE - R3G/DIR860l -> https://tinyurl.hu/Ntkb/

(#2646) bambano válasza _kovi_ (#2644) üzenetére


bambano
titán
LOGOUT blog

egyrészt a cron küld emailt a végeredményről.
másrészt a cron nem feltétlenül ugyanolyan környezetben futtatja a szkriptedet, mint login után. tehát lehet, hogy környezeti változó nincs beállítva.

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#2647) _kovi_


_kovi_
aktív tag

Valamiért nem fut meg a script..
CentOS7 a rendszer, mindent rootként csinálok. Tudom nem szabályos, de most ez így van. :)
Csak azért kérdeztem, mert az a gyanúm hogy ez a "warning" miatt nem fut meg?!...

(#2648) Fecogame válasza _kovi_ (#2647) üzenetére


Fecogame
veterán

- Van futtatási joga a scriptnek?
- Működik a cron?
- Tegyél be a scriptbe egy date >> /tmp/scriptem.log részt, és meglátod tényleg lefut-e
- A cron-ról logot a /var/log/cron vagy a /var/log/messages fájlban találsz

Lassú a mobilinterneted? 4G/LTE antennák, közvetlenül raktárról ---> http://bit.ly/LTE_Antennak

(#2649) Fecogame


Fecogame
veterán

Hogyan tudom egy stringről megállapítani, hogy tartalmaz-e a ponton és a 0-án kívül mást?

Konkrétabban van egy számom ( 0.000000 formátumban ), ami aztán lehet 0.534545,6.3434 vagy 8 is. Azt szeretném megvizsgálni, hogy az értéke 0 vagy annál nagyobb.

Talán a legegyszerűbb megoldás a pontra és 0-ra szűrni, és ha mást is tartalmaz, akkor jelez. De lehet van még egyszerűbb megoldás is :B

Lassú a mobilinterneted? 4G/LTE antennák, közvetlenül raktárról ---> http://bit.ly/LTE_Antennak

(#2650) bambano válasza Fecogame (#2649) üzenetére


bambano
titán
LOGOUT blog

most akkor melyiket akarod?
számnak tűnő stringre lehet regexp-pel szűrni
megnézni, hogy egy szám nagyobb-e, mint nulla, van test utasítás és -gt operátor.

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#2651) Fecogame válasza bambano (#2650) üzenetére


Fecogame
veterán

Végü megoldottam összehasonlítással, csak floating numbert nem olyan egyszerű bash alatt :)

NULLASERTEK="0.000000"
NAGYOBBERTEK="0.534545"
[ $(bc <<< "$NULLASERTEK <= $NAGYOBBERTEK") -eq 1 ] && echo "Nagyobb, mint 0"

Lassú a mobilinterneted? 4G/LTE antennák, közvetlenül raktárról ---> http://bit.ly/LTE_Antennak

(#2652) dabadab válasza bambano (#2650) üzenetére


dabadab
titán

De az csak egész számokra működik, bash nem tud tizedestörteket kezelni, szóval szerintem a regexillesztés lesz a megoldás.

DRM is theft

(#2653) Hege1234


Hege1234
addikt

Sziasztok!

programozás topikból küldtek ide hozzátok

bash-ba szeretném eljuttatni a .txt-be lévő sorokat a file és a resume rész után

save.sh
curl -s "http://kodi:kodi@192.168.1.10:8080/jsonrpc?Base" -H 'Content-Type: application/json' --data '[{"jsonrpc":"2.0","method":"Player.GetProperties","params":[1,["percentage"]],"id":17},{"jsonrpc":"2.0","method":"Player.GetItem","params":[1,["file"]],"id":18}]' | jq '.[].result.item.file, .[].result.percentage | select(. != null)' > save.txt
 
ez létrehozza a save.txt-t
smb://192.168.1.10/@.mkv
52.96696472167969

a load.sh betölti a videót az adott pozicióra ugorva

load.sh
curl -s "http://kodi:kodi@192.168.1.10:8080/jsonrpc?Base" -H 'Content-Type: application/json' --data '{"jsonrpc":"2.0","method":"Player.Open","params":{"item":{"file":"smb://192.168.1.10/@.mkv"},"options":{"resume":52.96696472167969}}}'

ebbe kellene valahogy a "file": és a "resume": után beilleszteni a txt-be lévő sorokat

bambano: itt az a gond, hogy ha a --data aposztrófok között van (ezt én se figyeltem, hogy külön paraméter), akkor a ${változó} behelyettesítést a shell nem csinálja meg. ezért a --data-t idézőjelek közé kellene tenni, viszont akkor belül a json idézőjelei be fognak kavarni, azokat escape-lni kell.
valószínűleg ez már offtopic itt, van rá szaktopic.

köszi, előre is a segítséget!

[ Szerkesztve ]

(#2654) bambano válasza Fecogame (#2651) üzenetére


bambano
titán
LOGOUT blog

jogos, ez elkerülte a figyelmem. :R

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#2655) Jester01 válasza Hege1234 (#2653) üzenetére


Jester01
veterán

Szerencse, hogy stringeket tetszőlegesen össze lehet fűzni.
echo 'foo${bar}'"${bar}"'baz'
Az elsőt nem bontja ki a másodikat igen.

Tehát a paraméter előtt szépen teszel egy idézőjelet majd bezárod az aposztrófot. Majd idézőjelbe beírod a változódat, majd visszanyitod az aposztrófot, beteszed a záró idézőjelet és minden mehet tovább.

Ha azt a 2 sort már betetted változókba mondjuk $url és $pos akkor

curl -s "http://kodi:kodi@192.168.1.10:8080/jsonrpc?Base" -H 'Content-Type: application/json' --data '{"jsonrpc":"2.0","method":"Player.Open","params":{"item":{"file":"'"${url}"'"},"options":{"resume":'"${pos}"'}}}'

[ Szerkesztve ]

Jester

(#2656) Hege1234 válasza Jester01 (#2655) üzenetére


Hege1234
addikt

köszönöm szépen! :R

filenev=$(head -1 save.txt)
idopont=$(head -2 save.txt | tail -1)
curl -s "http://kodi:kodi@192.168.1.10:8080/jsonrpc?Base" -H 'Content-Type: application/json' --data '{"jsonrpc":"2.0","method":"Player.Open","params":{"item":{"file":"'"${filenev}"'"},"options":{"resume":'"${idopont}"'}}}'

(#2657) Headless


Headless
őstag

sziasztok!

egy megoldást keresek egy bináris fájl szétválasztására egy bizonyos hex karakter sorozat elválasztásával több részre osztani, konkrétan egy cubemap kép sorozat ami jxr (képeket, posx,posy,posz,negx,negy,negz) fájlokat tartalmaz. ezeket szeretném szétválasztani. az elválasztó lehetne a wmphoto magic numbere \x4949BC. minden wm photo kép ezzel kezdődik.

mivel bináris fájl sed meg sorokat vizsgál az nem feltétlen megfelelő, egyáltalán van-e értelme bashal szenvedni, vagy ez már inkább egyszerűbb/gyorsabb egy rendes (nem script) nyelvel?

[ Szerkesztve ]

LEDE - R3G/DIR860l -> https://tinyurl.hu/Ntkb/

(#2658) Hege1234


Hege1234
addikt

amikor így szerepelnek a sorok a .txt fájban
jq, awk vagy más hasonló megoldással, hogyan lehetne
a számokat úgy átalakítani, hogy a 2. sorba legyenek és a 10 alatti számok elé
mindig kerüljön egy 0?

curl -s "http://kodi:kodi@192.168.1.10:8080/jsonrpc?Base" -H 'Content-Type: application/json' --data '[{"jsonrpc":"2.0","method":"Player.GetProperties","params":[1,["time"]],"id":17},{"jsonrpc":"2.0","method":"Player.GetItem","params":[1,["file"]],"id":18}]' | jq --raw-output '.[].result.item.file, .[].result.time.hours, .[].result.time.minutes, .[].result.time.seconds | select(. != null)' > "c:\kodi\info.txt"

[netes jq link]

eredeti:
plugin://plugin.video.youtube/play/?video_id=rhMTZB2WJWA
2
3
5

elképzelt: (235)
plugin://plugin.video.youtube/play/?video_id=rhMTZB2WJWA
020305

elképzelt 2.: (14325)
plugin://plugin.video.youtube/play/?video_id=rhMTZB2WJWA
014325

jq és awk kombinációjával jutottam el idáig, hogy
ez lett belőle de nem sikerül rájönnöm, hogyan lehetne úgy megoldani ahogy elképzeltem

| jq --raw-output '.[].result.item.file, .[].result.time.hours, .[].result.time.minutes, .[].result.time.seconds | select(. != null)' | awk '{key=$0; getline; print key "" $0;}'
plugin://plugin.video.youtube/play/?video_id=rhMTZB2WJWA2
35

| jq --raw-output '.[].result.item.file, .[].result.time.hours, .[].result.time.minutes, .[].result.time.seconds | select(. != null)' | awk 'NR > 1 { printf("") } {printf "%s",$0}'
plugin://plugin.video.youtube/play/?video_id=rhMTZB2WJWA235

(#2659) Headless válasza Headless (#2657) üzenetére


Headless
őstag

megoldottam, mivel a fájlokban van egy másik separator, azt feltudtam hasnálni, nyilván a zárt forráskódű fejlesztők is azt használják szeparátornak...
Röviden: grep kikeresem a byteoffseteket a separatorokhoz, majd végig megyek rajtuk while ciklusban, kiszámolom a megfelelő kezdő/végoffset értékeket és azt dd-vel szépen átmásálom. A separatort átírom, hogy ne legyen kereshető, nehogy megtalálja a zárt forráskódú szoftver fejlesztő, vagy bárki más aki rákeresne :)

Az elején van 4 byte felesleg, valamint a separator 8 byte azt hozzáadom az előző byteoffsethez

previousByteOffset=4
imageCount=0
grep -oba ggggggg "$imageFile" |while IFS=: read byteOffset rest;do
    dd if="$imageFile" of="$imageFile-$imageCount.jpg" bs=$(($byteOffset-$previousByteOffset)) count=1 skip=$previousByteOffset iflag=skip_bytes
    previousByteOffset=$(($byteOffset+8))
    imageCount=$(($imageCount+1))
done

LEDE - R3G/DIR860l -> https://tinyurl.hu/Ntkb/

(#2660) Jester01 válasza Hege1234 (#2658) üzenetére


Jester01
veterán

read line
echo "$line"
while read line
do
    printf "%02d" "$line"
done
echo

Jester

(#2661) Hege1234 válasza Jester01 (#2660) üzenetére


Hege1234
addikt

sajnos nem sikerült rájönnöm ezt hol kellene használnom, hogy beleírja az info.txt -be
a felugró ablakba a beírt számok 1-9 ig mindig kaptak nullát
a 014325, 020305 viszont nem sikerült beírnom
olyan mintha, mivel 10 nél nagyobb így a szám levenné róla a nullát vagy valamilyen műveletet is csinálna közbe

(#2662) Hege1234


Hege1234
addikt

segítséggel persze de meglett végül a megoldás

curl -s "http://kodi:kodi@192.168.1.10:8080/jsonrpc?Base" -H 'Content-Type: application/json' --data '[{"jsonrpc":"2.0","method":"Player.GetProperties","params":[1,["time"]],"id":17},{"jsonrpc":"2.0","method":"Player.GetItem","params":[1,["file"]],"id":18}]' | jq --raw-output '.[0].result + .[1].result | .item.file, ( .time | .hours * 3600 + .minutes * 60 + .seconds | strftime("%H%M%S"))' > info.txt

demo

(#2663) Fecogame


Fecogame
veterán

Van egy ilyen awk parancsom:

awk "BEGIN {print (($(awk "BEGIN {print (100 - 0.11)}") * 0.000025442)/100)}"

A kimenet pedig így néz ki:
2.5414e-05

Na most én ezt "normálisan" kiírva szeretném megkapni, nem pedig tudományos formátumban. Találtam ezt a megoldást, de beillesztve (print cserélve printf-re) nem működik, errort dob:

awk "BEGIN {printf "%.2f", (($(awk "BEGIN {printf "%.2f", (100 - 0.11)}") * 0.000025442)/100)}"

Error:
awk: line 1: syntax error at or near %

Hogyan kaphatnám meg az eredményt, ami 0.00002541401?

:R

Lassú a mobilinterneted? 4G/LTE antennák, közvetlenül raktárról ---> http://bit.ly/LTE_Antennak

(#2664) vargalex válasza Fecogame (#2663) üzenetére


vargalex
félisten

Ha tudod a tizedes jegyek számát, akkor:

echo | awk '{printf "%.13f", (100-0.11)*0.000025442/100}'

vagy a awk BEGIN-ben echo nélkül:

awk 'BEGIN {printf "%.13f", (100-0.11)*0.000025442/100}'

Természetesen, ha csak az általad írt kerekített érték kell, akkor a formátum a "%.11f".
Nem értem, hogy miért használod a beágyazott AWK-t...
Egyébként az AWK programot sima aposztrófok közé szokás tenni, így nincs kavarodás a printf formátum leírójával.

[ Szerkesztve ]

Alex

(#2665) Fecogame válasza vargalex (#2664) üzenetére


Fecogame
veterán

Sajnos nem tudom, hány tizedesjegy lesz benne.

Azért tettem macskakörmök közé, mert használok benne 2 változót is, csak most az egyszerűség kedvéért behelyettesítettem számokkal :)

Lassú a mobilinterneted? 4G/LTE antennák, közvetlenül raktárról ---> http://bit.ly/LTE_Antennak

(#2666) Lenry


Lenry
félisten

egy bash scriptem egy while ciklussal szalad végig egy mappán, és végzi el a feladatát.
lehet valahogy előre tudni, hogy hány elemen fog dolgozni?
ki szeretném íratni, hogy pl a 130-ból a 15. mappán dolgozik épp'. utóbbi nyilván nem gond. előbbire viszont nincs ötletem

[ Szerkesztve ]

Gvella Glan! | There are two types of people: Those who can extrapolate from incomplete data

(#2667) Jester01 válasza Lenry (#2666) üzenetére


Jester01
veterán

Először kigyűjtöd a listát amin végig kell menni?

Jester

(#2668) Lenry válasza Jester01 (#2667) üzenetére


Lenry
félisten

find . -mindepth 1 -maxdepth 1 -type d -name "*" -print | while ((i++)); read path
do
.....
done

ennyi az egész

[ Szerkesztve ]

Gvella Glan! | There are two types of people: Those who can extrapolate from incomplete data

(#2669) Jester01 válasza Lenry (#2668) üzenetére


Jester01
veterán

dirs=(*/)
i=1
for path in "${dirs[@]}"
do
  echo $((i++))/${#dirs[@]} "$path"
done

Jester

(#2670) Headless válasza Lenry (#2668) üzenetére


Headless
őstag

Szia

ehhez hasonló megoldás lehet

dir_list=$(find . -mindepth 1 -maxdepth 1 -type d -name "*" -print)
dir_count=$(echo "$dir_list" |wc -l)
echo "$dir_list" |while ((i++)); read path
do
.....
done

Én csak másoltam a te funkcióidat azt nem vizsgáltam, hogy megfelelő-e, vagy, hogy van-e egyszerűbb, mellesleg szerintem van kicsit fura a while ciklusod, nem is tudom hogy ez szintaktikailag helyes-e.

LEDE - R3G/DIR860l -> https://tinyurl.hu/Ntkb/

(#2671) Lenry válasza Headless (#2670) üzenetére


Lenry
félisten

hibátlanul fut, szóval olyan nagyon nem lehet elb*szva.

köszi a válaszokat :R

Gvella Glan! | There are two types of people: Those who can extrapolate from incomplete data

(#2672) JoinR válasza Lenry (#2668) üzenetére


JoinR
senior tag

Legkevesebb módosítással:

LEN=$(ls -l | grep -c ^d)
find . -mindepth 1 -maxdepth 1 -type d -name "*" -print | while ((i++)); read path
do
echo $i/$LEN
done

(#2673) Lenry válasza JoinR (#2672) üzenetére


Lenry
félisten

bakker, ez annyira egyszerű, nem tudom hogy nem jutott eszembe :W
köszi :R

[ Szerkesztve ]

Gvella Glan! | There are two types of people: Those who can extrapolate from incomplete data

(#2674) bambano válasza JoinR (#2672) üzenetére


bambano
titán
LOGOUT blog

miért nézed két módszerrel a listát?

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

Copyright © 2000-2024 PROHARDVER Informatikai Kft.