Pętlę przez folder i listę plików


14

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?


1
najpierw użyj „cd”. Jeśli potrzebujesz go „zwinąć”, nadal musisz wejść do katalogu. Możesz także użyć echo ${dir##*/}do zejścia ze ścieżki.
eexpress

Odpowiedzi:


32

Użyj, basenameaby usunąć ścieżkę wiodącą z plików:

for file in sample/*; do
    echo "$(basename "$file")"
done

Chociaż dlaczego nie:

( cd sample; ls )

3

Zakładając, że twoja powłoka go obsługuje, możesz użyć rozszerzenia parametrów

for path in sample/*; do
    printf -- '%s\n' "${path##*/}"
done

lub możesz po prostu przejść do tego katalogu i zrobić tam listę


1
Nie --jest tu potrzebne. Pierwszy argument jest stałym ciągiem bez myślników.
Kusalananda

Ponadto ${parameter##pattern}jest obsługiwany przez wszystkie powłoki POSIX.
Kusalananda

2

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”!

searchDir="sample/"
oldFiles=()
while IFS= read -r -d $'\0' foundFile; do
    oldFiles+=("$foundFile")
done < <(find "$searchDir" -maxdepth 1 -type f -print0 2> /dev/null)

if [[ ${#oldFiles[@]} -ne 0 ]]; then
    for file in "${oldFiles[@]}"; do
        curl -F data=@"$file" UPLOAD_ADDRESS
    done
fi

Co to jest katalog tutaj? $ „\ 0”? Chcę przekazać katalog, który jest w zmiennej ...
Soylent Graham,

searchDir jest zmienną katalogową. „-d $ '\ 0'” ustawia ogranicznik polecenia read na null.
bb_referee

Jak osiągnąć to samo w skorupce sh? Używam #! / Bin / sh
Ayusman

1

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:

ls -1 sample

Lepiej byłoby znaleźć, ponieważ możesz użyć filtrów:

find sample -type d -maxdepth 1 -printf '%f\n'

Jeśli chcesz uruchamiać polecenia na plikach, powinieneś użyć pętli find, a nie for:

find sample -type d -maxdepth 1 -exec basename {} \;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.