Loop melalui folder dan daftar file


14

Saya memiliki folder bernama 'sampel' dan memiliki 3 file di dalamnya. Saya ingin menulis skrip shell yang akan membaca file-file ini di dalam folder sampel dan mempostingnya ke situs HTTP menggunakan curl.

Saya telah menulis yang berikut ini untuk membuat daftar file di dalam folder:

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

Tapi itu memberi saya output berikut:

sample/log

sample/clk

sample/demo

Itu melampirkan folder induk di dalamnya. Saya ingin output sebagai berikut (tanpa nama folder induk)

log

clk

demo

Bagaimana saya melakukan ini?


1
gunakan 'cd' dulu. Jika Anda membutuhkan 'ikal', Anda masih perlu memasukkan direktori. Anda juga dapat menggunakan echo ${dir##*/}untuk melepas jalan.
eexpress

Jawaban:


32

Gunakan basenameuntuk menghapus jalur utama dari file:

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

Tapi mengapa tidak:

( cd sample; ls )

3

Dengan asumsi shell Anda mendukungnya, Anda dapat menggunakan ekspansi parameter

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

atau Anda bisa saja mengubah ke direktori itu dan melakukan listing di sana


1
Tidak --diperlukan di sini. Argumen pertama adalah string tetap tanpa tanda hubung.
Kusalananda

Juga, ${parameter##pattern}didukung oleh semua shell POSIX.
Kusalananda

2

Karena sistem * nix memungkinkan hampir semua karakter menjadi bagian dari nama file (termasuk termasuk spasi, baris baru, koma, simbol pipa, dll.), Anda tidak boleh menguraikan output dari perintah "ls" dalam skrip shell. Itu tidak bisa diandalkan. Lihat Mengapa Anda tidak harus menguraikan output ls .

Gunakan "find" untuk membuat daftar file. Jika Anda menggunakan Bash, Anda dapat memasukkan output "find" ke dalam array. Contoh di bawah ini, dengan peringatan bahwa saya menggunakan perintah "curl" yang tidak berfungsi!

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

Apa direktori di sini? $ '\ 0'? Saya ingin melewati direktori yang ada dalam variabel ...
Soylent Graham

searchDir adalah variabel direktori. "-d $ '\ 0'" menetapkan pembatas dari perintah baca ke nol.
bb_referee

Bagaimana cara mencapai hal yang sama dalam shell sh? Saya menggunakan #! / Bin / sh
Ayusman

1

Itu tergantung apa yang ingin Anda lakukan dengan direktori.

Untuk hanya mencetak nama, tanpa memeriksa apakah itu adalah direktori Anda dapat menggunakan ls:

ls -1 sample

Lebih baik ditemukan, karena Anda dapat menggunakan filter:

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

Jika Anda ingin menjalankan perintah pada file, Anda harus menggunakan find dan bukan untuk loop:

find sample -type d -maxdepth 1 -exec basename {} \;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.