» »

Bash osnove

Bash osnove

konjakk ::

Zanima me kako naredim skript, ki vse datoteke in mape v trenutni mapi, katerih imena se začnejo na b in imajo na predzadnjem mestu črko a preimenuje tako, da jim pred trenutno ime da predpono new._

začel sem z
for file in b* kako pa preveriš za a?
do
mv "$file" "new._$file";

Hvala za pomoč

c3p0 ::

Z regex, nekaj v stilu /^b.*a.$/

Zgodovina sprememb…

  • spremenil: c3p0 ()

Brane22 ::

Za čisti bash se mi ni dalo razmišljat, če pa rabiš oneliner, evo hitrega primera kako sem v mapi zlistal fajle, ki se pri meni začnejo na "E" in imajo predzadnjo črko d:

find . -type f | grep -e "^[./]*E" | grep -E "d."



Ostalo lahko hitro dodaš sam.

Zgodovina sprememb…

  • spremenilo: Brane22 ()

matja ::

for file in `ls b*a.*`; do mv $file "new._"$file; done

matja ::

Če iščeš a v imenu datoteke:

for file in `ls b*a?.*`; do mv $file "new._"$file; done


Predzadnji a v končnici pa:

for file in `ls b*.*a?`; do mv $file "new._"$file; done

MrStein ::

Heh, koliko napačnih predlogov :)

Pravilno je:
(shopt -s nullglob ; for fajl in b*a? ; do mv "$fajl" new._"$fajl" ; done)
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

MrStein ::

oziroma kot dejanska skripta:
#!/bin/bash
shopt -s nullglob
for fajl in b*a? ; do mv "$fajl" new._"$fajl" ; done
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

killa bee ::

Zanima me zakaj moja skripta ne dela tako kot mislim da bi morala?

kličem skripto z
 unsuffix testertest test 

in pričakujem nazaj ampak trenutno tega nazaj ne dobim
tester


Skripta:
#put the name of the file into the temp file
echo $1 > temp$$

#remove the ending 
real_name=$(sed 's/$2$//' temp$$)

echo $real_name

killa bee ::

aha sem že pogruntal
real_name=$(sed "s/$2$//" temp$$)

c3p0 ::

Ne rabiš temp fajla.

killa bee ::

kako pa pol, a tko:

real_name=$(sed "s/$2$//" < echo $1)

MrStein ::

echo $1 | sed...

Zakaj pa ne uporabiš že obstoječi ukaz basename?
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

killa bee ::

Hotel sem ta program narediti.

BlaY0 ::

Kaj je pa z rename narobe? Res da je del perla ampak ne vem zakaj bi kompliciral, če je že narejeno...

Razen če imaš to seveda za nalogo in mora biti nujno v bash-u spisano.

killa bee ::

ja taka je bla naloga

killa bee ::

Imam tak string
sob feb 25 08:03:00 CET 2017


S pomočjo grepa bi rad pridobil "08" in to sem poskušal na ta način:
date | grep '..:'


Problem pri tem ukazu je da najde tudi "03". Kako bi spremenil ukaz da bi mi našel samo 'first occurrence' od tega: "..:" ?

čuhalev ::

Presledek prej upoštevaj

robbmann ::

$ echo 'sob feb 25 08:03:00 CET 2017' | grep -oP '(?<=[a-z]{3} [a-z]{3} \d{2} )\d{2}'
08


Bere se pa nekak tkole: match sta zadnja dva digita: \d{2}
Ko naletis na to, naredis lookbehind assertion - torej se oceni tist izraz, ki je v oklepajih in mora matchat tisto kar je pred \d{2}
Fajn task za sobotno jutro :P

killa bee ::

kako pa z regular expression-om poiščeš naprimer 2nd occurrence nekega pattern-a?

@batt67 - dobim še dvopičje ki ga ne rabim
$ date | grep -oP ' ..:'
 10:


@robbmann
a je še kak bolj preprost način

če pa ni bom probal s kakšnim drugim ukazom

Zgodovina sprememb…

  • spremenilo: killa bee ()

čuhalev ::

date | grep -o ' ..:' | cut -f1 -d:

Sedaj ti ostane samo prvi presledek.

killa bee ::

date | grep -o ' ..:' | cut -c2-3

killa bee ::

mislim da je to še najlažji način
date | cut -d ' ' -f4 | cut -d: -f1

robbmann ::

Hja, sem mislil, da si omejen samo na grep. Drugač imaš X rešitev za tvoj problem :D
echo 'sob feb 25 08:03:00 CET 2017' | perl -ne 'print "$1\n" if / (..):/'           
echo 'sob feb 25 08:03:00 CET 2017' | cut -d":"  -f1 | cut -d" " -f4
echo 'sob feb 25 08:03:00 CET 2017' | python -c 'import sys; print(sys.stdin.readline().split()[3].split(":")[0])'
echo 'sob feb 25 08:03:00 CET 2017' | awk '{gsub(":"," ",$0);print $4}'
echo 'sob feb 25 08:03:00 CET 2017' | php -r '$a = explode(" ",fgets(STDIN));print(substr($a[3],0,2));'

c3p0 ::

Če ne gre za kako vajo, uporabiš enostavno:

date +%H

Brane22 ::

date | while read -a namex ; do echo ${namex[3]%%:*} ; done

ali tole:

 read -a namex < <(date) ;  echo ${namex[3]%%:*}

Zgodovina sprememb…

  • spremenilo: Brane22 ()


Vredno ogleda ...

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

batch fajl iz txt (strani: 1 2 )

Oddelek: Programiranje
659695 (8356) b3D_950
»

[Bash] - težave z IF stavki

Oddelek: Programiranje
102163 (2062) R33D3M33R
»

UNIX, mv, muvanje fajlse

Oddelek: Pomoč in nasveti
111277 (1143) BigWhale
»

[C++] Problem z datotekami in sortiranjem

Oddelek: Programiranje
271317 (946) BigWhale
»

Ime Priimek v Ime_Priimek (strani: 1 2 )

Oddelek: Programska oprema
554983 (3943) Doman

Več podobnih tem