Mam folder o nazwie „sample” i zawiera 3 pliki. Chcę napisać skrypt powłoki, który odczyta te pliki w przykładowym folderze i opublikuje go na stronie HTTP za pomocą curl.
Napisałem następujące informacje na temat wyświetlania plików w folderze:
for dir in sample/*; do
echo $dir;
done
Ale daje mi następujące wyniki:
sample/log
sample/clk
sample/demo
Dołącza do niego folder nadrzędny. Chcę dane wyjściowe w następujący sposób (bez nazwy folderu nadrzędnego)
log
clk
demo
Jak mam to zrobic?
shell-script
files
directory
for
Raji
źródło
źródło
echo ${dir##*/}
do zejścia ze ścieżki.Odpowiedzi:
Użyj,
basename
aby usunąć ścieżkę wiodącą z plików:Chociaż dlaczego nie:
źródło
Zakładając, że twoja powłoka go obsługuje, możesz użyć rozszerzenia parametrów
lub możesz po prostu przejść do tego katalogu i zrobić tam listę
źródło
--
jest tu potrzebne. Pierwszy argument jest stałym ciągiem bez myślników.${parameter##pattern}
jest obsługiwany przez wszystkie powłoki POSIX.Ponieważ systemy * nix pozwalają na umieszczenie prawie każdego znaku w nazwie pliku (w tym białych znaków, znaków nowej linii, przecinków, symboli potoku itp.), Nigdy nie należy analizować danych wyjściowych polecenia „ls” w skrypcie powłoki. To nie jest wiarygodne. Zobacz, dlaczego nie powinieneś analizować danych wyjściowych ls .
Użyj „znajdź”, aby utworzyć listę plików. Jeśli używasz Bash, możesz wstawić wynik „find” do tablicy. Przykład poniżej, z zastrzeżeniem, że użyłem niedziałającego polecenia „curl”!
źródło
To zależy od tego, co chcesz zrobić z katalogami.
Aby po prostu wydrukować nazwę, bez sprawdzania, czy jest to katalog, którego można użyć ls:
Lepiej byłoby znaleźć, ponieważ możesz użyć filtrów:
Jeśli chcesz uruchamiać polecenia na plikach, powinieneś użyć pętli find, a nie for:
źródło