ha bash -x ./script.sh előtaggal futtatod, akkor látjuk, milyen értéket vesz fel, próbáld úgy
Gyorskeresés
Legfrissebb anyagok
- Bemutató Route 66 Chicagotól Los Angelesig 2. rész
- Helyszíni riport Alfa Giulia Q-val a Balaton Park Circiut-en
- Bemutató A használt VGA piac kincsei - Július I
- Bemutató Bakancslista: Route 66 Chicagotól Los Angelesig
- Tudástár AMD Radeon undervolt/overclock
Általános témák
LOGOUT.hu témák
- [Re:] Elektromos rásegítésű kerékpárok
- [Re:] [D1Rect:] Nagy "hülyétkapokazapróktól" topik
- [Re:] [attilasd:] A laposföld elmebaj: Vissza a jövőbe!
- [Re:] Real Racing 3 - Freemium csoda
- [Re:] [gban:] Ingyen kellene, de tegnapra
- [Re:] A használt VGA piac kincsei - Július I
- [Re:] [Luck Dragon:] Asszociációs játék. :)
- [Re:] [btz:] Internet fejlesztés országosan!
- [Re:] eBay-es kütyük kis pénzért
- [Re:] PLEX: multimédia az egész lakásban
Szakmai témák
PROHARDVER! témák
Mobilarena témák
IT café témák
Hozzászólások
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 ]
KrAt
veterán
+ excludes=("home/juliska/tmp")
tar parancsban '--exclude='\''home/juliska/tmp'\'''
Ez nekem nem tetszik
[ Szerkesztve ]
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
Keem1
addikt
Sajnos úgy se megy 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:~ $
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
Keem1
addikt
Így jó
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
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
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
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
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
_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
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
_kovi_
aktív tag
Köszi!
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
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ő
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
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
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ő
Véreshurka
senior tag
Tudsz ajánlani kezdőknek szóló oldalt a script-ekről?
El Psy Kongroo
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
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
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
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?
Ha csalódni akarsz, bízz az emberekben!
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
_kovi_
aktív tag
Sziasztok!
Fájlnévre illeszkedést milyen paranccsal tudom vizsgálni egy scriptben?
AWK? SED ?
Köszi!
Sonja
veterán
Köszi!
Ha csalódni akarsz, bízz az emberekben!
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
_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 ]
gpwfile=$(date '+%F.gwz')
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
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
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
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
_kovi_
aktív tag
dabadab és bambano köszönöm mindkettőtöknek!
_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 ]
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
_kovi_
aktív tag
Bakker
Köszönöm!
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...
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
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