Adında boşluk olan dosyalar


4

Bir dizinde dosyaların listesini depolayan var adında bir değişken var. Tüm dosyalar arasında dolaşıyorum ve bir dizin bulursam ekrana "Dizin" verdim. aşağıdaki kod:

var=$(ls dir)

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

2 sorum var:

1 - Bunu bir fonksiyonun içinde yapıyorum ve $ file değişkeninin yerel kalmasını istiyorum, böylece fonksiyonum bittiğinde ona erişemiyorum. Bu değişkeni yerel olarak nasıl ayarlayabilirim? Yapamam for local file in $var; ve döngüden önce $ dosyasını bildiremiyorum.

2 - Benim döngü ne zaman çalışmıyor $(ls dir) adın içinde boşluk olan bir dosya içeriyor. Örneğin $dir 3 dosya, dosya1 dosya 2 ve dosya3, $var sadece file1 ve file3'ü gerçek dosyalar olarak tutabilir, ancak file 2 dosyaya ve 2'ye ayıracağı için çalışmayacaktı.


2
alan için etrafına çift tırnak "$file". daha karmaşık durumlar için kullanmak zorunda kalabilirsiniz $"$file".
Frank Thomas

Bunu denedim ama işe yaramadı çünkü zaten $ (ls dir) alanını alıyorum, bu yüzden değişken dosyamı başlattığımda alanı zaten göz önünde bulunduruyorum.
Fxbaez

3
Deneyin ls -Q dir. bu, her dosya adının etrafına tırnak koyacaktır. Bu sorun, kişilerin ayrıştırılmasından kaçınılmasının tavsiye edilmesinin bir parçasıdır ls çıktı ve yerine kullan find.
Frank Thomas

Yanıtlar:


3

$ File dosyasını yerel yapmak için: kullanabilirsiniz local file atamadan önce.

Boşluk içeren dosyalar için: ayrıştırma , bir joker karakter kullanın ve değişken referansların etrafında çift tırnak işareti kullanın:

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

Döngü başlamadan önce dosya adlarını saklamak istiyorsanız, düz değişken yerine bir dizi kullanın:

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

Görmek BashFAQ # 20: "Yeni satırları, boşlukları veya her ikisini içeren dosya adlarını nasıl bulabilir ve güvenle kullanabilirim?" daha karmaşık örnekler ve daha fazla püf noktası için.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.