Sziasztok,
Azt szeretném kérdezni, hogy meg lehet -e oldani ezt a 2 parancsot 1 ben?
for a in `seq 0 9`; do >0$a.txt; done
for b in `seq 10 30`; do >$b.txt; done
Azt szeretném, hogy a fájlnevek 01, 02 ... 09, 10, 11 stb néven jöjjenek létre.
Köszi
--Zoli
- 9675 megtekintés
Hozzászólások
Ha a seq a kiszemelt eszközöd, akkor vess egy pillantást a -w kapcsolójára!
- A hozzászóláshoz be kell jelentkezni
Pont akkor írtam amikor Te is írtad.
A -s kapcsoló mire jó a gyakorlatban?
-- Zoli
- A hozzászóláshoz be kell jelentkezni
Mint általában, a felhasználásnak a képzelet és az ad-hoc felbukkanó feladatok sokfélesége szab határt. Most hirtelen egy pozícióvonalzó jutott az eszembe:
$ seq -s"...." 0 5 40
0....5....10....15....20....25....30....35....40
- A hozzászóláshoz be kell jelentkezni
De komoly ez, köszi!!:-) Gondolom függőlegesen is ki lehet íratni, csak akkor kell bele egy \n szerűség:-)
-- Zoli
- A hozzászóláshoz be kell jelentkezni
Majdnem. A seq manuálja nem írja, hogy bármilyen szekvenciát feloldana -s értékében, de simán lehet konkrét soremelést kell ütni a szeparátor megfelelő helyein (idézőjelezni kötelező):
$ seq -s"
.
.
.
.
" 0 5 20
- A hozzászóláshoz be kell jelentkezni
Ez is jó szerintem:
seq -f "track%02g" 1 20
Találtam egy jó kis tutorial videót a seq hez - abban voltak ilyesmik.
A seq manjából erre magamtól nem jöttem volna rá - sejtettem, hogy ilyet is lehet, csak azt nem írják a man seqban, hogy idézőjelek közé kellene tenni...
Meg ilyen kis nyalánkságok teszik érdekessé a seq kel való ismerkedést pl: seq -sw: 20 =/ seq -ws: 20
A 2. esetben az s 'separator' hez kapcsolódik a : jel, ezért úgy működik ahogy szerettem volna.
Találtam egy oldalt, ami nagyon tetszik: http://www.unixcl.com/
-- Zoli
- A hozzászóláshoz be kell jelentkezni
Nem kell idézőjelek közé tenni. Az idézőjelek a shellnek szólnak, a seq semmit sem lát belőlük. Az más kérdés, hogy ha nem rakod idézőjelbe a stringet, akkor a shellnek szóló speciális karaktereket a shell értelmezi, és nem az történik, amit szeretnél. De erről a seq mit sem tud. Példa:
grep -v '^#' /etc/fstab | sed -r 's/ +/ /g' | cut -d' ' -f3
grep -v '^#' /etc/fstab | sed -r 's/ +/ /g' | cut -d\ -f3
Viszont hibás:
grep -v '^#' /etc/fstab | sed -r 's/ +/ /g' | cut -d -f3
cut: the delimiter must be a single character
Try 'cut --help' for more information.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Bocsánat, már meg is fejtettem, -w kapcsoló!
Az a baj, hogy mindig egyszerűbb megkérdezni, mint utánanézni...
Azt hittem bonyolultabb ez.
-- Zoli
- A hozzászóláshoz be kell jelentkezni
(Látom, hogy megvan.) Csak hogy egy nem teljesen triviális másfajta verziót is mutassak. Sajnálatos módon bash nem jó hozzá, valamiért ez csak ksh-ban működik (a bash látszólag nem ismeri a balra- és jobbra igazított változókat):
typeset -iZ2 j; j=1; while [ $j -lt 31 ] ; do touch $j.txt ; j=j+1 ; done
(Nyilván még jobb lenne, ha nem hívnánk mindegyikre touch-ot, hanem először legeneráljuk a fájlneveket, aztán pl egy $( .. ) formában odaadjuk ezt a touchnak.)
- A hozzászóláshoz be kell jelentkezni
touch helyett: >$j.txt
- A hozzászóláshoz be kell jelentkezni
touch {00..30}.txt
BASH_VERSION=4.2.37(1)-release
~~~~~~~~
Linux 3.2.0-0.bpo.4-486
Debian 6.0.7
- A hozzászóláshoz be kell jelentkezni
Megint tanultam valami újat. :)
Köszi!
- A hozzászóláshoz be kell jelentkezni
bázz.. +1 :)
- A hozzászóláshoz be kell jelentkezni
+1!
- A hozzászóláshoz be kell jelentkezni
Aztamindenit!! :)))
- A hozzászóláshoz be kell jelentkezni
+1
--
NetBSD - Simplicity is prerequisite for reliability
- A hozzászóláshoz be kell jelentkezni
Ez is nagyon tetszik, fel is írtam, köszi az ötletet!
Mi a különbség a kettő között?
1. for i in `seq -w 10`; do >${i}.txt; done
2. touch {01..10}.txt
A touch megváltoztatja az időbélyeget - ennyit tudok, de ha for ciklussal hozom létre ezt a 10 fájlt, akkor lesz valami különbség a végeredmény tekintetében?
Megnéztem ls -l parancsal mindkét parancs kimenetét, de nekem úgy tűnik, hogy ugyanaz a végeredmény.
-- Zoli
- A hozzászóláshoz be kell jelentkezni
Akkor van különbség, hogyha a file már létezett és volt benne valami, figyeld a módosítási időt és a file méretet:
$ ls -l bla
-rw-rw-r-- 1 sz sz 1048576 Apr 13 01:57 bla
$ touch bla
$ ls -l bla
-rw-rw-r-- 1 sz sz 1048576 Aug 31 09:45 bla
$ >bla
$ ls -l bla
-rw-rw-r-- 1 sz sz 0 Aug 31 09:46 bla
- A hozzászóláshoz be kell jelentkezni
Értem, köszi!
-- Zoli
- A hozzászóláshoz be kell jelentkezni
Attól függ, hogy mit értesz végeredmény alatt.
Ha konkrétan a 10 fájl létrehozására (vagyis egyik fájl sem létezik még) fókuszálunk, akkor hatásábn a kettő egyenértékű.
Viszont annak köszönhetően, hogy MÁSHOGY teszik, amit tesznek, más rendszeren, szélesebb intervallumot megadva a touch végeredménye lehet az, hogy nem fut le, vagyis nincs végeredmény.
Nézzük meg, hogy valójában mi fut le:
$ set -x
$ touch {01..10}.txt
+ touch 01.txt 02.txt 03.txt 04.txt 05.txt 06.txt 07.txt 08.txt 09.txt 10.txt
Vagyis a shell legyártja nekünk a röviden megfogalmazott parancsból az annak a megfelelő szó szerinti parancsot a 10 argumentummal, és azt futtatja.
Az argumentumok száma (a parancs hossza) nem növelhető minden határon túl:
getconf -a | grep ^ARG_MAX
ARG_MAX 2097152
Ezen rendszeren, ha 2M-nál hosszabbra nőne, kapnék egy "arg list too long" üzenetet.
A korlát oprendszerenkén, kernelenként, sőt (ahol módosítható) futásonként változhat.
- A hozzászóláshoz be kell jelentkezni
Ezt csak részben értem. Mit csinál a set -x?
-- Zoli
- A hozzászóláshoz be kell jelentkezni
Megkéri a shellt, hogy végrehajtás előtt mutassa meg, valójában mit fog végrehajtani. Tehát a változókat, *-ot stb. behelyettesíti és ennek az eredményét mutatja meg.
Próbáld ki, mit látsz, ha set -x után beírsz mondjuk egy "echo *"-ot!
- A hozzászóláshoz be kell jelentkezni
Próbálom megérteni:-)
Ebben tudnál segíteni? Az apró jel mit jelent?
A képet a Képfeltöltés.hu tárolja. http://www.kepfeltoltes.hu
-- Zoli
- A hozzászóláshoz be kell jelentkezni
Az a jel szerintem valami UTF-akárhányas karakter. Láttam már ilyet, de csak olyankor, mikor véletlenül bináris fájl tartalmát néztem meg cat-tel. :)
- A hozzászóláshoz be kell jelentkezni
Azok épp bináris karakterek, és szerintem pont azok, amivel a prompt (PS1 változó) színezését végzi. Egyébként tapasztalatom szerint abban a téglalapocskában - asszem - a hexa kódja szerepel az adott bináris bigyónak.
- A hozzászóláshoz be kell jelentkezni
Konkrétan azoknak a "bináris bigyóknak", amiket a gnome-terminal nem tud értelmezni. :)
A putty nem ír ilyeneket, ő vagy tud vele kezdeni valamit, vagy lenyeli.
- A hozzászóláshoz be kell jelentkezni
Valami köze van a színezéshez szerintem:
A képet a Képfeltöltés.hu tárolja. http://www.kepfeltoltes.hu
-- Zoli
- A hozzászóláshoz be kell jelentkezni
mutasd már meg a $PS1 és a $PROMPT_COMMAND-odat!
~~~~~~~~
Linux 3.2.0-0.bpo.4-486
Debian 6.0.7
- A hozzászóláshoz be kell jelentkezni
Tessék:
echo "$PS1"
\[\033[01;33m\]$? $(if [[ $? == 0 ]]; then echo "\[\033[01;32m\];)"; else echo "\[\033[01;31m\];("; fi) \[\033[1;32m\]\u@\h\[\033[01;34m\] \w $\[\033[00m\]
echo $PROMPT_COMMAND
printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"
Egyébként át fogom szerkeszteni a PS1 et ez alapján:
http://stackoverflow.com/questions/103857/what-is-your-favorite-bash-pr…
mivel ez így, ahogy most van olvashatatlan számomra.
-- Zoli
- A hozzászóláshoz be kell jelentkezni
az a két jel egy 0x01 és egy 0x02 karaktert jelenít meg, de nem tudom, mi oka van rá, hogy kiírja. pontosan a \[ és a \] jelek helyén írja ki, amik arra valók, hogy a köztük lévõ karaktereket (ansi escape sequence) ne számolja hozzá a prompt hosszához, így a parancssor szerkesztése közben pontosan tudja, hol az eleje.
~~~~~~~~
Linux 3.2.0-0.bpo.4-486
Debian 6.0.7
- A hozzászóláshoz be kell jelentkezni
Mi értelme van egy 1-es és egy 2-est kiírni? Komolyan nem értem...
Kikerestem, a $ jel kódja: 0x24, de a PS1 változómban csak simán a $ jel található.
-- Zoli
- A hozzászóláshoz be kell jelentkezni
A hexa 1 (0x01) az nem 1-es, hanem Ctrl-A (a másik meg a Ctrl-B). De abban egyetértünk, hogy én sem értem miért írja ki.
- A hozzászóláshoz be kell jelentkezni
A fenti magyarázattal együtt azt javaslom, ezen ne akadj fenn, vagyis ne ezen akadj fenn. Sikerült belefutnod, egy furcsa konstellációba a finomhangolt promptod folytán. Javaslom, hogy amikor a parancssorodat debuggolod, állíts konzervatívabb promptot, hogy ne takarja a fa az erdőt.
- A hozzászóláshoz be kell jelentkezni
(DELETE által önlektorálva)
Asszem, pedzem. A bash a PS1-ben minden \[ és \] szekvenciát lecserél 0x01 (STX, start of text) illetve 0x02 (ETX, end of text) karakterre. Ezeket amikor saját maga formázza a promptot, szépen lenyeli, de itt továbbadja az egész szekvenciát az echonak (már az ANSI szekvenciákat feloldva), ami viszont ezért kénytelen azt kiírni.
A látható promptban egyiknek sincs nyoma (nincs vezérlő funkció), de ha a terminál tud UTF-8-at, a set -x belső formázása után a kimenet árulkodik a kódolástól idegen, funkciótlan karakterekről. UTF-8 nélkül az egésznek nyoma sincs.
- A hozzászóláshoz be kell jelentkezni
(Ez valamitől duplázódott, ezért törölve)
- A hozzászóláshoz be kell jelentkezni
Persze kérdés, mit nem értettél. A shell a globbingot, különféle helyettesítéseket kifejti egy bufferbe, majd átadja a parancsnak. A parancs nem tudja, hogy az argumentumok hogyan álltak elő: begépelték őket, vagy egy rafinált kifejezés állította elő.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Próbálom megérteni:-)
-- Zoli
- A hozzászóláshoz be kell jelentkezni
A touch inkáb a >> operátornak felel meg:
for i in `seq -w 10`; do >>${i}.txt; done
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Csak a bejegyzés kedvéért, a seq tud formázott kimenetet számsorokra:
seq -w 1 200
- A hozzászóláshoz be kell jelentkezni
formázottat is tud:
seq -f 'filename-%02g' 1 200
- A hozzászóláshoz be kell jelentkezni
Köszi.
Átírtam a 2 est 3 masra teszt céljából. Nagyon tetszik.
Hol lehetne utánanézni, hogy a g mit jelent stb. Gondolom a g mellett még léteznek más paraméterek is. Ez kicsit hasonlít a printf formázására, amit a K&R könyvben az elején írnak, de nem teljesen úg yműködik szerintem.
-- Zoli
- A hozzászóláshoz be kell jelentkezni
man seq -> info coreutils vagy http://www.gnu.org/software/coreutils/manual/html_node/seq-invocation.h…
- A hozzászóláshoz be kell jelentkezni
Ezek azért nem túl jó doksik szerintem, legalábbis ezekből én még nem lettem okosabb:-( a -w egyértelmű, de ezek:
‘%a’, ‘%e’, ‘%f’, ‘%g’, ‘%A’, ‘%E’, ‘%F’, ‘%G’
Nem túl beszédes az ezekről írtak. Gondolom ez annak egyértelmű, aki tud c ben programozni. gyakorlatiasabb példákból mindig hamarabb sikerült valamire rájönnöm, mint ilyen doksik, meg man oldalak olvasgatásából.
-- Zoli
- A hozzászóláshoz be kell jelentkezni
Pedig teljesen egyértelműen oda van írva: pont az a jelentése, mint a printf esetén. Ezek után már csak a printf manualja kell neked :-)
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
Tényleg printf, csak lebegőpontosnak tekinti, pl:
seq -f'%6.4g' 0.1 0.1 11.1
- A hozzászóláshoz be kell jelentkezni