Kolokwium z sysopów i moje przykładowe rozwiązania do niektórych zadań… Mile widziane alternatywne toki rozumowania i rozwiązania. :-)

Polecenie 1.

Korzystając z polecenia mkdir i konstrukcji pomocniczej (man bash) stwórz strukturę katalogów:

kat1  kat2  kat3  kat4   ...  kat15
      kat4  kat6  kat8   ...  kat30
            kat9  kat12  ...  kat45
                  ...    ...  kat225

Polecenie 2.

Zapisz linię polecenia, która przeniesie wszystkie pliki w katalogu bieżącym zawierające w nazwie ciąg znaków kpn do katalogu KPN w Twoim katalogu domowym.

Polecenie 3.

Stwórz listę plików o rozmiarze większym niż 3MB w Twoim katalogu domowym w pliku bydlaki.lista.

Polecenie 4.

Zapisz linię polecenia, które w przypadku gdy liczba plików w aktualnym katalogu jest parzysta wyświetli nazwy 6 plików w największym rozmiarze bez pliku największego.

Polecenie 5.

Zapisz linię polecenia, która zmieni nazwy wszystkich plików w katalogu bieżącym z rozszerzeniem exe na starą nazwę z rozszerzeniem executable.

Polecenie 6.

Zapisz polecenie, które wykona statystykę słów pliku, którego nazwa zostanie pobrana z klawiatury (read). Wyniki mogą być w postaci słowo liczba_wystapien

Polecenie 7.

Napisz skryt "zegara konsolowego", który jako argument przyjmie parametr określający format wyświetlanego czasu (12- lub 24-godzinny). Ponadto za każdym razem, kiedy użytkownik wciśnie klawisz Ctrl-| (SIGQUIT) program zmieni format wyświetlania.

Komentarze do wpisu "Systemy operacyjne – pracowanie z bashem":

1. Jiobel napisał(a):
02 Cze 2007, 02:03:53

Zad 2.
mv -f ./*kpn* ~/KPN 2> /dev/null || echo Brak plikow...

Zad 3.
find -size +3M > ~/bydlaki.lista

Zad 5.
find *.exe -exec mv {} {}cutable \; 2> /dev/null || echo Brak plikow *.exe!

Zad 4.
( [ `expr \`ls -l | wc -l\` % 2` -eq 0 ] && ls -lS | head -n 8 | tail -n 6 ) || echo Nieparzysta ilosc plikow...

2. Michał Górny napisał(a):
02 Cze 2007, 09:49:17

Zad. 1) Brak objaśnienia „diagramu”, nie wiem, jak to tak naprawdę ma być ułożone.

Zad. 2) mkdir -p ~/KPN; mv ./*kpn* ~/KPN/

Zad. 3) find -size +3M -fprint ~/bydlaki.lista

Zad. 4) (znów niesprecyzowana końcówka — czy ma być wyświetlone 6-1, czyli 7-1)
PLIKI=`find -maxdepth 1 -type f -printf „%s\t%P\n” | sort -n -r`
expr `echo „$PLIKI” | wc -l` % 2 || ( echo „$PLIKI” | head -6 | tail -5 | sed -e „s/^[0-9]*\t//g”

Zad. 5) rename .exe .executable *.exe

3. Jiobel napisał(a):
02 Cze 2007, 13:05:47

W kat1 ma znajdować się kat2, kat3, kat4 aż do kat15. W kat2 ma być kat4. W kat3 powinny być kat6 i kat9. I tak dalej, rozumiesz?

W Twoim zadaniu 2. oddzielasz dwie komendy „;” i w związku z tym moje pytanie – to jest to samo, jak wrzuciłbym to w potok (czyli w moim rozumowaniu oddzielił je „|”)?

Zadanie 4. i Twoje wątpliwości… Zupełnie nie wiem, o co Ci chodzi, więc nie pomogę.

A zadanie 5. i Twoje rozwiązanie – się podoba, zwłaszcza jeśli porównać do mojego… :-)

4. Michał Górny napisał(a):
02 Cze 2007, 13:16:36

Ad. 1) (nie sprawdzałem, mogłem popełnić błąd, zwłaszcza z ((…)) )
mkdir kat1; cd kat1
for (( N = 2 ; N <= 15 ; N++ )); do
        mkdir kat$N; cd kat$N
        for (( M = 2 ; M <= N ; M++ )); do
                mkdir kat`expr $M * $N`
        done
        cd ..
done

Ad. 2) Hm… tak samo to nie jest, ale w tym przypadku nie zrobi różnicy. Średnik jest równoznaczny z nową linią.

Ad. 4) „wyświetli nazwy 6 plików w największym rozmiarze bez pliku największego.” — tzn. ma wybrać 6 i pierwszy odrzucić, wypisując 5, czy wybrać 6, licząc od drugiego z kolei?

A tak swoją drogą, preferuję użycie „find” zamiast „ls” w skryptach. Nie mam żadnych dowodów, ale odnoszę wrażenie, że niezawsze „ls” może dawać tak samo sformatowany wynik. A w przypadku „find” masz pełną kontrolę.

PS. Dalsze też chcesz?

5. Jiobel napisał(a):
02 Cze 2007, 18:21:32

Ad4 – wybrać 6 od drugie z kolei.
Ad2 – racja, racja…

W tym 1. się walnąłeś na czymś (mi krzyczy, że przy expr)

Jeśli chodzi o dalsze – już są zrobione, później dopisze ale… jak Ci się chce, możesz też to zrobić. :-)

A jeśli chodzi o ls vs. find – co masz na myśli mówiąc, że ls nie daje tego czasem, czego moglibyśmy się spodziewać?

6. Michał Górny napisał(a):
02 Cze 2007, 19:34:10

Ad. 1) Wyeskejpuj gwiazdkę, bo bash podstawia wszystkie pliki.

A odnośnie ls: nie mówię, że nie daje — mam wątpliwości, czy zawsze i wszędzie będzie dawać. ‘find’ ma na pewno bardziej ujednolicony output.

7. Michał Górny napisał(a):
02 Cze 2007, 22:02:16

Ad. 7) Takie coś może być(?):

#!/bin/bash

if [ "$1" == '24' ]; then
FORMAT="+%H:%M:%S"
elif [ "$1" == '12' ]; then
FORMAT="+%I:%M:%S %p"
else
echo 'Wrong format given.'
exit 1
fi

trap 'if [ "$FORMAT" == "+%H:%M:%S" ]; then FORMAT="+%I:%M:%S %p"; else FORMAT="+%H:%M:%S"; fi' QUIT

LC_ALL=C # AM/PM fi
while true; do
date "$FORMAT"
sleep 1
echo -e -n "\e[F\e[K"
done

PS. Popraw se szablon, bo bloki kodu Ci wycina q ;.

8. GiM napisał(a):
09 Cze 2007, 19:42:14

jiobel: spróbuj stworzyć plik, który ma w nazwie ‘\n’ to zobaczysz o co peresowi biegało z find vs ls
edycja: btw: czyta się dziobel czy z polskiego jiobel :)

Dodaj komentarz: