[BASH] Lista nazw Skrypt

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 
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") }'
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?

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 ?

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 !

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" '{}' +
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

0

Spróbuj tak:

find "$1" -name "$2" -exec stat -c "%N %u %U" '{}' \;
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ć ?

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

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 .

0

Uruchamiasz nowy proces dla każdego pliku. Tylko idiota robi coś takiego. find(1) w wersji GNU posiada opcję -printf.

> time -f %e find -exec stat -c '%n %u %U' {} \; >/dev/null
36.11
> time -f %e find -printf '%p %U %u\n' >/dev/null
0.16
> 

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