[BASH] Lista nazw Skrypt

Anonimek Anonim
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8
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:

Kopiuj
./lista.sh <katalog> <maska>

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

skrypt:

Kopiuj
#!/bin/bash

cd $1
for a in $2;
do
stat -c '%n %U %Id ' $a
done 
rrowniak
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 82
0

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

Kopiuj
ls -l *.c | awk '{ printf("%s %s ", $3, $9); system("id -u $3") }'
Anonimek Anonim
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8
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?

Anonimek Anonim
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8
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 ?

Anonimek Anonim
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8
0
rrowniak napisał(a):

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

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

Super Wszystko działa. Bardzo Dziękuje !

hauleth
  • Rejestracja: dni
  • Ostatnio: dni
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:

Kopiuj
find "$1" -name "$2" -exec stat -f "%N %u %Su" '{}' +
Anonimek Anonim
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8
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:

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

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

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

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

rrowniak
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 82
0

Spróbuj tak:

Kopiuj
find "$1" -name "$2" -exec stat -c "%N %u %U" '{}' \;
Anonimek Anonim
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8
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ć ?

Anonimek Anonim
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8
0
rrowniak napisał(a):

Spróbuj tak:

Kopiuj
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

Anonimek Anonim
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8
0
Anonimek Anonim napisał(a):
rrowniak napisał(a):

Spróbuj tak:

Kopiuj
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

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

Dziękuję za pomoc i doceniam .

  • Rejestracja: dni
  • Ostatnio: dni
0

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

Kopiuj
> 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
> 

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.