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?

Raji
sumber
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 )
DopeGhoti
sumber
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

Eric Renouf
sumber
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
bb_referee
sumber
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 {} \;
ctx
sumber