[BASH] Lista nazw Skrypt

Odpowiedz Nowy wątek
2019-01-28 17:30
0

Witam Jestem nowicjuszem i mam problem ze skryptem Czy ktoś mógłby mi pomóc i delikatnie go poprawił ? Byłbym bardzo wdzięczny.
Napisać skrypt przyjmujący dwa parametry: maskę nazwy pliku i nazwę katalogu. Zadaniem skryptu jest wyświetlenie listy nazw plików z podanego katalogu, pasujących do podanej maski razem z nazwą właściciela i jego numerem UID.

Nazwa pliku: lista.sh

Wywołanie:

./lista.sh <katalog> <maska>

$1 - nazwa katalogu
$2 - maska prezentowanych plików

skrypt:

#!/bin/bash

cd $1
for a in $2;
do
stat -c '%n %U %Id ' $a
done 
edytowany 1x, ostatnio: hauleth, 2019-01-28 22:45

Pozostało 580 znaków

2019-01-28 18:25
0

Nie lepiej zrobić to na kombinacji ls -l + awk + id? Czyli coś na zasadzie:

ls -l *.c | awk '{ printf("%s %s ", $3, $9); system("id -u $3") }'

Pozostało 580 znaków

2019-01-28 22:20
0

Dziękuje bardzo za odpowiedź . Działa Co mam zmienić żeby to połączyć z wywoływaniem ./lista.sh <katalog> <maska> tak żeby była możliwość wyboru katalogu i maski pliku?

Pozostało 580 znaków

2019-01-28 22:22
0

cd $1
ls -l *.$2 | awk '{ printf("%s %s ", $3, $9); system("id -u $3") }'
Czy to ma wyglądać w ten sposób ?

Pozostało 580 znaków

2019-01-28 22:29
0
rrowniak napisał(a):

Nie lepiej zrobić to na kombinacji ls -l + awk + id? Czyli coś na zasadzie:

ls -l *.c | awk '{ printf("%s %s ", $3, $9); system("id -u $3") }'

Super Wszystko działa. Bardzo Dziękuje !

Pozostało 580 znaków

2019-01-28 22:54
0

Rozwiązanie @rrowniak prawie działa, wyłoży się na plikach, które zawierają w sobie spację, znak nowej linii czy inne dziwne znaki. Dodatkowo polega na globbing, co nie zawsze może działać tak jak chcieliśmy. Poprawnym rozwiązaniem będzie użycie find oraz stat:

find "$1" -name "$2" -exec stat -f "%N %u %Su" '{}' +
edytowany 3x, ostatnio: hauleth, 2019-01-29 12:55
To też nie zadziała :) - rrowniak 2019-01-29 08:50
Wygląda, że składnia exec jest niekompletna - brak {} i \;. Opcja -f w stat jest do wyświetlania statusu systemu plików, podejrzewam, że chodziło Ci o opcję formatowania -c, czyli wyglądało by to mniej więcej tak: stat -c "%N %u %U" - rrowniak 2019-01-29 09:36
@rrowniak: rzeczywiście zapomniałem {}, ale nie masz racji co do stat, które nawet nie zna -c - hauleth 2019-01-29 12:55

Pozostało 580 znaków

2019-01-30 12:45
0
hauleth napisał(a):

Rozwiązanie @rrowniak prawie działa, wyłoży się na plikach, które zawierają w sobie spację, znak nowej linii czy inne dziwne znaki. Dodatkowo polega na globbing, co nie zawsze może działać tak jak chcieliśmy. Poprawnym rozwiązaniem będzie użycie find oraz stat:

find "$1" -name "$2" -exec stat -f "%N %u %Su" '{}' +

Niestety nie działa Zapisuje to tak jak wcześniej w pliku lista.sh

#!/bin/bash 
 find "$1" -name "$2" -exec stat -f "%N %u %Su" '{}' +

wyrzuca błąd :
find: brak argumentu dla -exec

edytowany 2x, ostatnio: Anonimek Anonim, 2019-01-30 12:47
Możliwe, że Bash używa + do czegoś innego i jest znakiem specjalnym, możesz spróbować escapować go. Dodatkowo jeśli używasz narzędzi GNU (przykładowo jesteś na Linuksie) to wtedy musisz użyć -c zamiast -f zgodnie z tym co @rrowniak napisał w komentarzu do mojego posta (ja używam narzędzi z FreeBSD). - hauleth 2019-01-30 12:52

Pozostało 580 znaków

2019-01-30 12:55
0

Spróbuj tak:

find "$1" -name "$2" -exec stat -c "%N %u %U" '{}' \;

Pozostało 580 znaków

2019-01-30 13:00
0

"Możliwe, że Bash używa + do czegoś innego i jest znakiem specjalnym, możesz spróbować escapować go."
W jaki sposób mogę to zrobić ?

Pozostało 580 znaków

2019-01-30 13:10
0
rrowniak napisał(a):

Spróbuj tak:

find "$1" -name "$2" -exec stat -c "%N %u %U" '{}' \;

Działa lecz nadal jest problem Gdyż mogę wyszukać tylko jeden plik a nie wszystkie zawarte w danym katalogu z wybraną maską pliku Skrypt działa gdy w wywołaniu wpiszę całą nazwę pliku np. plik.txt

edytowany 1x, ostatnio: hauleth, 2019-01-30 13:47

Pozostało 580 znaków

2019-01-30 13:12
0
Anonimek Anonim napisał(a):
rrowniak napisał(a):

Spróbuj tak:

find "$1" -name "$2" -exec stat -c "%N %u %U" '{}' \;

Działa lecz nadal jest problem Gdyż mogę wyszukać tylko jeden plik a nie wszystkie zawarte w danym katalogu z wybraną maską pliku Skrypt działa gdy w wywołaniu wpiszę całą nazwę pliku np. plik.txt

Ok Juz poprawiłem

!#/bin/bash
 find "$1" -name "*.$2" -exec stat -c "%N %u %U" '{}' \;

Dziękuję za pomoc i doceniam .

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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