Pliki ze spacją w nazwie

4

Mam zmienną o nazwie var, która przechowuje listę plików w katalogu. Przeglądam wszystkie pliki i jeśli znajdę katalog, wypisuję na ekranie „Katalog”. kod poniżej:

var=$(ls dir)

for file in $var; do
    if [ -d $dir/$file ]; then
        echo "Directory"
    fi
done

Mam 2 pytania:

Po pierwsze: robię to wewnątrz funkcji i chcę, aby zmienna pliku $ pozostała lokalna, więc kiedy moja funkcja się zakończy, nie mam do niej dostępu. Jak ustawić tę zmienną lokalnie? Nie mogę for local file in $var;i nie mogę zadeklarować pliku $ przed zapętleniem.

2. Moja pętla nie działa, gdy $(ls dir)zawiera plik ze spacją w nazwie. Na przykład, jeśli $dirma 3 pliki, plik 1 plik 2 i plik 3, $vartylko pliki 1 i 3 będą przechowywane jako prawdziwe pliki, ale plik 2 nie będzie działał, ponieważ podzieliłby go na plik 2 i. Jak mogę rozwiązać problem z plikami, które mają miejsce w ich imiona?

Fxbaez
źródło
2
dla miejsca, wstaw podwójne cudzysłowy "$file". w bardziej złożonych sytuacjach może być konieczne użycie $"$file".
Frank Thomas
Próbowałem tego, ale to nie zadziałało, ponieważ już otrzymuję przestrzeń z $ (ls dir), więc kiedy inicjuję mój plik zmiennej, już biorę pod uwagę przestrzeń.
Fxbaez,
3
Spróbować ls -Q dir. spowoduje to umieszczenie cudzysłowów wokół każdej nazwy pliku. Ten problem jest częścią tego, dlaczego zaleca się, aby ludzie unikali analizowania lsdanych wyjściowych i zamiast tego używali find.
Frank Thomas

Odpowiedzi:

3

Aby ustawić plik $ lokalnie: możesz go użyć local fileprzed przypisaniem do niego.

W przypadku plików ze spacjami: nie analizuj ls , użyj symboli wieloznacznych i podwójnych cudzysłowów wokół odwołań do zmiennych:

local file
for file in "$dir"/*; do  # Note that $file will contain $dir as well as the filename
    if [ -d "$file" ]; then
        echo "Directory: $file"
    fi
done

Jeśli chcesz zapisać nazwy plików przed uruchomieniem pętli, użyj tablicy zamiast zwykłej zmiennej:

local -a filelist
filelist=("$dir"/*)
local file
for file in "${filelist[@]}"; do
    ...

Zobacz BashFAQ # 20: „Jak znaleźć i bezpiecznie obsługiwać nazwy plików zawierające znaki nowej linii, spacje lub oba?” dla bardziej złożonych przykładów i więcej sztuczek.

Gordon Davisson
źródło