Online 103 uživatelů Přihlášení | Registrace | Zaslat heslo | Prohlížení bez přihlášení

 

BASH - Bourne Again Shell - skripty, tipy, triky [ ID: 282 ] - [ Počítače (hardware, software) / Programování ]
1 / 49
MEPHISTOFELES   16:29:39 04.04.2013
Diky za rady :)
BORIN   16:04:10 04.04.2013
MEPHISTOFELES [ 14:00:36 04.04.2013 ]: Pro WinSCP nepotřebuješ žádný plugin, stačí si nastavit externí editor (tvůj oblíbený :-) Viz Možnosti -> Předvolby -> Editory. Dokonce si tam pro různé přípony můžeš nastavit různý editor.
DWORKIN   14:25:42 04.04.2013
DWORKIN [ 13:27:13 04.04.2013 ]:  zkousel jsem odstranit ten eval, ale pak me to nezere mezery a kdo vi co jeste.. i kdyz jsem zamenil mezeru za \mezeru. Jedine co lze jeste udelat pro bezpecnost je mv -n -- ...
DWORKIN   14:22:28 04.04.2013
MEPHISTOFELES [ 14:00:36 04.04.2013 ]: Unix me nezivi, pisi to v kwrite, protoze ma zvyraznenou syntaxi, coz se hodi, hned vidis ze mas treba spatne uvozovky, nebo klicove slovo. A nejen v bashi.
KOLCON   14:20:32 04.04.2013
MEPHISTOFELES [ 14:00:36 04.04.2013 ]: vim, co jineho ;)
NELDOR   14:05:15 04.04.2013
MEPHISTOFELES [ 14:00:36 04.04.2013 ]: Ja pouzivam vi(m). A nejak nechapu, k cemu by takovy plugin byl - i kdyz pracuju na woknech, tak si prece muzu pustit putty a editovat ty texty primo na linuxu, kde si muzu vybrat z hromady kvalitnich editoru (stejne kazdy nakonec skonci bud u vimu nebo emacsu ::D)...
ANTZ   14:02:39 04.04.2013
MEPHISTOFELES [ 14:00:36 04.04.2013 ]: jedno ssh vim, druhé ssh na spouštění... lepší editor než vim stejně neexistuje :2)
MEPHISTOFELES   14:00:36 04.04.2013
Mozna trochu blba otazka :) ale pouzivate nejaky editor pro psani Shell sktriptu? Nebo to mastite v klasickem textaku? Existuje treba nejaky plugin pro WinSCP, ktery by trochu pomahal pri psani skriptu?
DWORKIN   13:27:13 04.04.2013
Tak kdyby nekdo chtel tak tu mam skript na ruseni poddadresaru. Soubory v nem lze prejmenovat na podadresar_puvodnijmeno, nebo puvodnijmenobezpripony_adresar_pripona, nebo ponechat. Hlida si to, zda uz ten soubor neexistuje pak pridava cislo na konec.

#!/bin/bash

echo "+-------------------------------------------------------------------+"
echo "| Prohleda obsah adresare na dane urovni a pokud v nich najde pod-  |"
echo "| adresar, tak veci v nem presune o uroven vys a podadresar smaze.  |"
echo "| Jestlize obsahuje jeste skryte soubory, ponecha ho.              |"
echo "| Povinne parametry:                                                |"
echo "| 1. 'p' ./podadresar/jmeno.pripona -> ./podadresar_jmeno.pripona  |"
echo "| 2. 'j'                            -> ./jmeno_podadresar.pripona  |"
echo "| 2. 'n'                            -> ./jmeno.pripona              |"
echo "+-------------------------------------------------------------------+"
echo " Melo by to snad sezvejkat mezeru v nazvu, apostrofy, &, ..."

if [ $# -lt 1 ] || [ $# -gt 1 ] ; then
  echo
  echo " Spatny pocet parametru..."
  exit 1
fi

poradi=$1

if [ "$poradi" != "p" ] && [ "$poradi" != "j" ] && [ "$poradi" != "n" ] ; then
  echo " Spatny parametr..."
  exit 1
fi

# Mazani od konce po prvni vyskyt ${promnena%maska}, co to jde ${promnena%%maska}, napr. ${soubor%.*} zrusi jen priponu i s teckou
# Mazani od zacatku po prvni vyskyt ${promnena#maska}, co to jde ${promnena##maska}, napr. ${soubor##*.} smaze vse krome pripony vcetne posledni tecky

for adresar in *
do   
  if test -d "${adresar}"
  then
      echo "Adresar: ${adresar}"
      cd "${adresar}"
      chyba=$?
      [ $chyba -gt 0 ] && echo "Nelze vstoupit do adresare: ${adresar}!?" && continue

      for soubor in *
      do
        if  test -d "${soubor}"  ; then  echo "Podadresar..." ; fi
        # nema priponu? (neobsahuje tecku?)
        if [ "${soubor##*.}" == "${soubor}" ] ; then
    if [ "$poradi" == "j" ] ; then naco="${soubor}"_"${adresar}" ; elif [ "$poradi" == "p" ] ; then naco="${adresar}"_"${soubor}" ; else naco=${soubor} ; fi
        else
    if [ "$poradi" == "j" ] ; then naco="${soubor%.*}"_"${adresar}.${soubor##*.}" ; elif [ "$poradi" == "p" ] ; then naco="${adresar}"_"${soubor}" ; else naco=${soubor}; fi
        fi

        if test -e "../${naco}" ; then # soubor s timto jmenem o adresar vyse uz existuje... pridame priponu 000+
    nuly="000"
    bonus="0"
    while test -e "../${naco}.${nuly:${#bonus}}${bonus}" ; do
      bonus=$(($bonus + 10))
      if test -e "../${naco}.${nuly:${#bonus}}${bonus}" ; then
          bonus=$(($bonus + 1))
      else
  bonus=$(($bonus - 9))
      fi
    done
    naco="${naco}.${nuly:${#bonus}}${bonus}"
        fi

        naco=${naco//"\""/"\\\""} # " -> \"
        soubor=${soubor//"\""/"\\\""} # " -> \" 
        echo "mv -- \"${soubor}\" ../\"${naco}\""
        eval "mv -- \"${soubor}\" ../\"${naco}\""
      done
      cd ".." # nevstoupeni do podadresare bylo osetreno
      rmdir -- "${adresar}"
  fi
done
BIRDHANKA   16:01:06 28.03.2013
:14) :14) :14) :18)
NELDOR   15:51:29 28.03.2013
BIRDHANKA [ 15:47:32 28.03.2013 ]: No znalost skriptovacich jazyku se vzdycky hodi... Predstav si, ze bys tohle mela delat rucne, nebo nedejboze v nejakem Excelu ;-).
BIRDHANKA   15:47:32 28.03.2013
no jeste perl abych se zacala ucit a muzu si to jit rovnou hodit
NELDOR   15:46:37 28.03.2013
KOLCON [ 15:37:42 28.03.2013 ]: Jj, v perlu to bude asi nejrychlejsi (pomineme-li napsat to v C ::D), ale i to awk bude radove rychlejsi, nez ten puvodni skript.
KOLCON   15:37:42 28.03.2013
BIRDHANKA [ 15:13:45 28.03.2013 ]: nevim, pripada mi to jako idealni zadani pro Perl...
BIRDHANKA   15:13:45 28.03.2013
ok, diky za pomoc. Jdu to prepsat, to jsou data za jeden mesic, potrebuju to pak spustit jeste 11x, takze to je fakt na dlouho. Dikes
NELDOR   14:49:15 28.03.2013
BIRDHANKA [ 14:32:14 28.03.2013 ]: Takze nejaky 2 GB ciste textovych dat? Pokud na jednom radku je nejakych 50 znaku, tak mi to vychazi nanejakych 40 milionu radku ke zpracovani? To je fakt docela hodne na cisty bash. Pouzij radeji treba to awk, viz ANTZ [ 17:16:47 27.03.2013 ]. Nejvic casu takhle totiz systemnetravi vlastnim vypoctem, ale spoustenim tech prikazu, ktere jsou vetsinou samostatne programy, coz zere radove vic casu, nez ten vypocet.
Secist 40 milionu cisel a pocitat nejaky ten prumer je trivialita, ale spustit 40 milionkrat "cut" a "wc" je daleko narocnejsi...
ANTZ   14:46:54 28.03.2013
BIRDHANKA [ 14:32:14 28.03.2013 ]: to asi moc nejde odhadnout, záleží na výkonu a zatížení serveru.... každopádně ten tvůj kód není zrovna optimalizovaný, takže by mě to ani nepřekvapilo...
BIRDHANKA   14:32:14 28.03.2013
mno....
poustim to nad soubory, kterych je celkem 30, kazdy z nich ma 64,1 MB. Jak dlouho byste cekali, ze to bude trvat? Je normalni, kdyz uz to bezi 2,5 hodiny?
NELDOR   10:39:01 28.03.2013
BIRDHANKA [ 10:30:54 28.03.2013 ]: Jinak magie to neni, ono je to dost logicke a relativne jednoduche, ale mas pravdu, ze to chce trochu vic casu ;-). Ale 20 minut uz je docela dost, to tech dat mas asi fakt hodne. V tom pripade by asi bylo lepsi pouzit to awkcko rovnou, a nebo treba perl. Ale na zacatecnika je to kazdopadne od tebe vyborny vykon! ::YES
NELDOR   10:36:36 28.03.2013
BIRDHANKA [ 10:30:54 28.03.2013 ]: Zkus "vykockovat" /etc/issue:
$ cat /etc/issue
Debian GNU/Linux 5.0 \n \l

BIRDHANKA [ 10:31:46 28.03.2013 ]: Pouzij treba uz zminene "avekacko":
$ echo 11.3 12.5 | awk '{print ($1 + $2)/NF}'
11.9
1 / 49