BASH zadanka

0

hejka wszystkim
dopiero zaczynam naukę basha i prosilbym o pomoc w rozwiązaniu poniższych zadań

  1. Napisz skrypt, który wypisze nazwy tych plików z katalogu domowego bieżącego użytkownika w których treści nie ma żadnej cyfry
  2. Napisz skrypt który zapisze do pliku P te spośród swoich argumentów, które są nazwami pustych plików zwykłych, do których mamy prawo zapisu lub pustych katalogów. Nazwa pliku P musi być podana jako pierwszy argument, a reszta argumentów są to argumenty, które testujemy i które być może będziemy zapisywać do pliku P

z góry dziękuje za każdą pomoc :)

1

Nauka polega chyba na robieniu zadań samemu :P
1.

ls -1 $HOME | grep -v [0-9]
P=$1
for arg in ${@:2}; do if [[ ! -s $arg ]] && [[ -w $arg ]] || [[ -d $arg ]] && [[ -z $(ls -A ${arg}/* >/dev/null 2>&1) ]]; then echo $arg >> $P; fi; done

https://www.dartmouth.edu/~rc/classes/ksh/print_pages.shtml

1

Dla pierwszego problemu można tak:
find $HOME -type f -exec sh -c 'grep -q -m1 -E '[0-9]' {} || echo {}' \;

edycja:
Założyłem, że chodzi o 0-9 w treści plików, a nie nazwy plików :-)

1

@yarel: pewnie masz racje :P
Co do 1. to bym użył xargs'a
find $HOME -maxdepth 1 -type f | xargs -I{} sh -c 'if [[ $(grep [0-9] "{}") ]]; then echo {}; fi'

1

No tak, rozwiązujcie mu zadania, a on nawet nie pokaże czy coś próbował samemu wymyślać...

1

Wszystkie proponowane przez Was rozwiązania zawierają poważne defekty, m.in. brak odporności na białe znaki w nazwach ścieżek.

Rozwiązanie problemu pierwszego. Czysty Bash, zero forków:

shopt -s extglob nullglob

for file in ~/+([!0-9]); do
    printf '%s\n' "${file##*/}"
done

(Jeżeli dodatkowo chcesz wypisać pliki ukryte, ustaw dotglob.)

Dlaczego printf zamiast echo?

$ ls -l
total 0
-rw-r--r--. 1 anon anon 0 May 24 13:37 -n
-rw-r--r--. 1 anon anon 0 May 24 13:37 foo
$ echo *
foo$ 
0

@Mózg: masz rację jeśli chodzi o białe znaki. Co do forkowania, to zauważ, że są to dwa różne skrypty: Twój patrzy na 0-9 w nazwach plików, a mój na wystąpienie 0-9 w zawartości pliku.
Możliwe, że autorowi pytania chodziło o wystąpienie 0-9 w nazwach, a nie zawartości.

To ls vs echo mnie trochę dziwi:

[pkw@cent ~]$ mkdir bar
[pkw@cent ~]$ cd bar
[pkw@cent bar]$ touch -- "-n foo"
[pkw@cent bar]$ ls
-n foo
[pkw@cent bar]$ echo *
-n foo

Możliwe, że chodzi o różnice w ustawieniach terminala. Możesz rozwinąć temat?

@Silv: forkowanie = chodzi o uruchamianie dodatkowego procesu shella w ramach przetwarzania, czyli tę sekcję sh -c ... , która wywoływana jest per znaleziony plik. Będzie ich odpalanych tyle, ile znalezionych plików.

2

Co do pierwszego, to nie trzeba nic więcej niż sam zwykły grep (zadziała nawet z wersją BSD): grep -RL '[0-9]' ~

0
yarel napisał(a):

Twój patrzy na 0-9 w nazwach plików, a mój na wystąpienie 0-9 w zawartości pliku.

Das rite. Zbyt mocno zasugerowałem się drugim postem.

Możliwe, że chodzi o różnice w ustawieniach terminala. Możesz rozwinąć temat?

To są dwa pliki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1