bash find w skrypcie

0

Witam.
Pisze skrypt w bashu który ma wyszukać pliki o podanej nazwie lub rozszerzeniu jako argument wywołania. Co się dzieje to wypisuje tylko jeden plik gdy komenda wpisana z "palca" wyświetla kilka plików.

#!/bin/bash
set -x
find -name "$1"

Wywołanie: ./script *.txt

proszę o pomoc

0

Odpowiedź jest bardzo prosta, zostałeś zaatakowany przez coś co się nazywa shell expansion.

Wyjaśnienie:

Mamy drzewo plików takie jak to:

.
├── a
│   ├── bar.txt
│   └── foo.txt
├── b
│   ├── bar.txt
│   └── foo.txt
├── bar.txt
├── c
│   ├── bar.txt
│   └── foo.txt
├── echo.sh
├── find.sh
└── foo.txt

3 directories, 10 files

Skrypt echo.sh:

#!/bin/bash
set -x
echo "$@"

Wywołanie ./echo *.txt:

bar.txt foo.txt

Więc jak widzisz Twój zapis *.txt został przez powłokę rozwinięty do bar.txt foo.txt. Z racji, że bierzesz tylko pierwszy argument, to Twoje wywołanie find brzmi wtedy find -name bar.txt zamiast oczekiwanego find -name "*.txt". By temu zapobiec masz 2 wyjścia:

  • Escape gwiazdki: ./script \*.txt
  • Użyć cudzysłowów: ./script "*.txt"
0

niestety żadne z wywołań nie działa. Przy wywołaniu ./skrypt "*.txt" polecenie wygląda następująco: find -name foo.txt boo.txt co jest błędnym wywołaniem.

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.