unix alapofeladatok

Fórumok

S

Hozzászólások

Egész pontosan mi a kérés? Házi feladat vagy ZH másokkal való megoldatása?

A feladatok önálló megoldásához az alábbiakat érdemes tanulmányozni, minden kérdésre megvan bennük a válasz:

man bash
man chmod
man dd
man du
man file
man find
man grep
man init
man kill
man ls
man lsof
man ssh
man ssh-agent
man tee
man wc

ilyen mintha már pont lett volna tegnap

1. dd if=/dev/scd0 of=foo.iso
2. tee
3. lsof, attól függ hogy milyen rendszerről beszélünk
4. /etc/rc1.d
5. KILL, 9
6. ls -i
7. ls -l foo.txt, fájl esetén a permission utáni szám a linkek száma
8. chmod g-w foo.txt
9. a kérdés nem egyértelmű, de ~/.ssh/authorized_keys2 mondjuk.
10. ~, de ezt se értem.

Meg mi az ,hogy a névből nem derül ki, hogy mp3/jpg -e ?
Itt van egy, de 1000%, hogy erre nem lehet sokkal szebb megoldást csinálni, honnan állapítod meg pl a file típusát? Ha mégis lehet kiterjesztés alapján, akkor pár sor az egész...


#!/bin/sh

if [ -z "$1" ]; then
        echo "Usage: $0 <dir>"
        exit 3
fi

if ! [ -d "$1" ] ; then
        echo "$1 is not a directory"
        exit 2
fi

summary() {
        MP3_SUM=0
        JPEG_SUM=0
        MP3_LINES=0
        JPEG_LINES=0
        while read FILENAME; do
                CONTENT=`file "$FILENAME" 2>/dev/null`
                if echo $CONTENT | egrep -e MP3 -e "layer III" >/dev/null; then
                        SIZE=`du -s "$FILENAME" | cut -f 1`
                        MP3_SUM=$((MP3_SUM+SIZE))
                        MP3_LINES=$((MP3_LINES+1))
                fi
                if echo $CONTENT | grep JPEG >/dev/null; then
                        SIZE=`du -s "$FILENAME" | cut -f 1`
                        JPEG_SUM=$((JPEG_SUM+SIZE))
                        JPEG_LINES=$((JPEG_LINES+1))
                fi
        done
        echo "MP3: $MP3_SUM ($MP3_LINES file(s))"
        echo "JPEG: $JPEG_SUM ($JPEG_LINES file(s))"
        echo "------"
        echo "$((MP3_SUM+JPEG_SUM)) ($(($MP3_LINES+$JPEG_LINES)) file(s))"
}

find "$1" -type f | summary

1.) Mi van például az ilyen nevű file-okkal? A fenti sor beleszámolná akkor is, ha nem a kívánt típusba tartoznak.
WNJMP3981/probafile.txt
UJPEG-8.tar.gz

2.) Hasonlóképpen hibásan működne a nevükben kettőspontot tartalmazó file-ok esetén (pl.: "a:b:c:e:f:g"), amik lehetnének a kérdéses típusúak is.
3.) A /dev/null mérete mindig nulla, és biztosan nem a két említett típusba tartozik, ezért nem kell beleszámolni. Ez eleve felesleges.
4.) Éppen ezért nem is kell a listából kiszűrni.
5.) Ha sok file lenne, több total sor lenne a végeredmény.

Nezd, az ilyen feladatoknal az ilyen extrem eseteket nem veszik figyelembe, jo megoldasnak szamit.
A feladat altalanosan fogalmaz. Mivel ezek abszolute beginner feladatok, igy nem kriterium a atombiztos megoldas elkeszitese, hiszen a xargs-rol is csak annyit tudnak, hogy a stdin-rol olvasott adatokat adja at a parancsnak argumentumkent. Az hogy adott mennyisegnel tor, meg hogy vannak korlatai, nem feltetlen mondja el a tanar (nalunk se mondta el pl.), mert az alap tudashoz tokeletesen eleg. Majd kesobb, ha mar meg tud keresni egy fajlt a rendszerben mc meg 5000 cd nelkul, akkor lehet vele ilyenrol is tarsalogni, de addig csak felesleges plusz tanulnivalo.

en konkretam mindig elmondom, hogy mi a problema a finddal:

find nemkell/. | xargs rm

torese:
mkdirhier alma\ /home

find nemkell/. | xargs -l rm

torese:
mkdirhier 'alma
/home'

parancs utan adja ki az ember.
Altalaban az oktatasban ugyan lenyegesen egyszerusitett parancskeszletet oktatunk (az erthetoseg miatt) azonban bizonyos tipikus biztonsagi problemat mutato egyszerusiteseket nem tehetunk.
A find -nal mondani kell a
find . -direxec
de legalabb a
find . -print0 | xargs -0
jellegu kombinaciokig. Csak hogy lassak, az ember shellscriptben gyorsan programozik, nem biztonsagosan (vagy gyorsat).
(let's flame;-)

1.) Mi van például az ilyen nevű file-...
2.) Hasonlóképpen hibásan működne a nevükben...
Ha meg space-t tartalmazo file-nev lenne benne, tan az egesz szet is esene.
Igazabol csak arra akartam ravilagitani, hogy milyen is a 'shell-izu' shell script.

3.) A /dev/null mérete mindig nulla, és biztos...
4.) Éppen ezért nem is kell a listából kiszűrn.
Nem. A /dev/null azert kerult bele, mert hibas $dirname eseten az egesz `pwd`-t kezdi a du maszirozni, ahelyett hogy leallna a find hibauzenetevel, amit igy meg is tesz.

5.) Ha sok file lenne, több total sor lenne a végeredmény.
Bovebben?

1.) és 2.) Értem. Ezzel nem tudok vitatkozni, mivel ez megközelítés kérdése. Eleve nem tartom jó ötletnek egy házifeladat fórumtagok által történő komplett megoldását, inkább a rávezetést tartom célszerűnek. De ha már így alakult, akkor faragjunk belőle jól működő scriptet.
3.) és 4.) Igaz, de ez is nézőpont kérdése. A kiírásban szerepelt a script helyes használatára való figyelmeztetés, valamint a "Ha nem létező könyvtárat adtunk meg..." rész. Ebbe nálam beleértődne a nem könyvtár paraméter esete is. Most egy közönséges file-lal is működik.
5.) Ez az előző hozzászólásod utolsó sorának kiegészítése. A kiírás így szólt: "ezek a típusú állományok összesen mennyi
helyet foglalnak."
. Sok vagy hosszúnevű file-ok esetén az xarg miatt a du többször fut le. Ennek megfelelően tobb "total" sor lesz. Ezeknek a soroknak az első oszlopa a cat által beletett file-sorszám, míg a második oszlop az adott du általi méret-részösszeg (az előző du utániak). (Kiválóan tesztelhető mondjuk 5000 db 120 karakter hosszú névvel.)

Azaz az output így néz ki:


  A   B    total
  C   D    total
  E   F    total
  G   H    total

, ahol


  G: az összes darabszám + a du futásainak száma
  B + D + F + H: a teljes méret

Tehát az output utolsó sorának első oszlopában lévő értékből az output sorainak számát levonva kapnánk a tényleges darabszámot; a második oszlopban szereplő értékeket pedig a végén össze kellene adni.


% dirname=/home/samba/shared/music
% find $dirname | xargs -l file | egrep "MP3|JPEG" | cut -d: -f1 | xargs du -c /dev/null | grep -v /dev/null | cat -n - | grep total
usage: xargs [-0opt] [-E eofstr] [-I replstr [-R replacements] [-S replsize]]
             [-J replstr] [-L number] [-n number [-x]] [-P maxprocs]
             [-s size] [utility [argument ...]]

Egyébként az enyém meg linux alatt nem megy valamiért.

Azert jo lenne, ha ez nem lenne altalanos, vagyis hogy hazikat oldunk meg. Oke, jo kihivas nekunk meg minden, de igy az eletbe nem fogod megtanulni a mukodeset az egyes parancsoknak. Es egyaltalan nem fogsz megtanulni Unixot/linuxot kezelni. Ha nem akarod megtanulni, akkor kar volt az egeszet elkezdeni, ha meg meg akarod tanulni, akkor tanulj meg Google-n keresni, meg tanuld meg a man parancs hasznalatat meg tanulj meg egy picit angolul (nem kell nagyon). Ez a hozzaallas azonban egyaltalan nem jo.

az lenne a szivelyes keresem, hogy ird le, melyik iskola melyik targyarol van szo.

Kosoznom.