Bir klasörde dolaşın ve dosyaları listeleyin


14

'Örnek' adlı bir klasör var ve içinde 3 dosya var. Bu dosyaları örnek klasör içinde okuyacak ve curl kullanarak bir HTTP sitesine gönderecek bir kabuk komut dosyası yazmak istiyorum.

Klasör içindeki dosyaları listelemek için aşağıdakileri yazdım:

for dir in sample/*; do
        echo $dir;
        done

Ama bana şu çıktıyı veriyor:

sample/log

sample/clk

sample/demo

Üst klasörü ekliyor. Çıkışı aşağıdaki gibi istiyorum (üst klasör adı olmadan)

log

clk

demo

Bunu nasıl yaparım?


1
önce 'cd' kullanın. Eğer 'kıvırmak' gerekiyorsa, yine de dizini girmeniz gerekir. Ayrıca echo ${dir##*/}yolu çıkarmak için de kullanabilirsiniz .
eexpress

Yanıtlar:


32

basenameBaştaki yolu dosyaların dışına çıkarmak için kullanın :

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

Neden olmasın:

( cd sample; ls )

3

Kabuğunuzun bunu desteklediğini varsayarsak parametre genişletmeyi kullanabilirsiniz

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

ya da o dizine geçip listeyi orada yapabilirsiniz


1
--Burada gerekli değildir. İlk argüman, tire işareti olmayan sabit bir dizedir.
Kusalananda

Ayrıca, ${parameter##pattern}tüm POSIX kabukları tarafından desteklenir.
Kusalananda

2

* Nix sistemleri neredeyse herhangi bir karakterin dosya adının bir parçası olmasına izin verdiğinden (boşluk, yeni satırlar, virgül, boru sembolleri vb. Dahil) hiçbir zaman kabuk komut dosyasındaki "ls" komutunun çıktısını ayrıştırmamalısınız. Güvenilir değil. Bkz Eğer ls çıkışını ayrıştırmak olmamalıdır Neden .

Dosyaların bir listesini oluşturmak için "find" kullanın. Bash kullanıyorsanız, "find" çıktısını bir diziye ekleyebilirsiniz. Aşağıdaki örnek, çalışmayan bir "kıvırma" komutu kullandığım uyarı ile!

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

Buradaki dizin nedir? $ '\ 0'? Değişken bir dizini geçmek istiyorum ...
Soylent Graham

searchDir dizin değişkenidir. "-d $ '\ 0'" okuma komutunun sınırlayıcısını null olarak ayarlar.
bb_referee

Aynı şeyi sh kabuğunda nasıl elde edebilirim? #! / Bin / sh kullanıyorum
Ayusman

1

Bu, dizinlerle ne yapmak istediğinize bağlıdır.

Sadece bir dizin olup olmadığını kontrol etmeden adı yazdırmak için ls kullanabilirsiniz:

ls -1 sample

Filtreleri kullanabileceğiniz için bulmak daha iyi olur:

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

Dosyalarda komut çalıştırmak istiyorsanız, for döngüsünü değil find komutunu kullanmalısınız:

find sample -type d -maxdepth 1 -exec basename {} \;
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.