Temukan file secara alfabetis sebelum string yang diberikan

8

Jika saya memiliki direktori yang penuh dengan file dan sub direktori. Apa cara terbaik untuk membuat daftar hanya file biasa yang jatuh abjad sebelum string yang diberikan?

Saat ini yang terbaik yang bisa saya lakukan menggunakan bash adalah sebagai berikut:

for x in `find . -maxdepth 1 -type f | sort`
do
   if [[ "$x" > './reference' ]]
   then
      break
   fi

   echo $x
done

Saya merasa ada cara yang lebih ringkas untuk melakukan ini, tetapi saya tidak yakin apa itu. Ada ide?

Mike Deck
sumber

Jawaban:

4

jika Anda membutuhkan semuanya

 find . -maxdepth 1 -type f | sort |  awk '$0 > "./reference"'

jika Anda membutuhkan yang pertama

 find . -maxdepth 1 -type f | sort |  awk '$0 > "./reference"{print;exit}'
iruvar
sumber
Terima kasih! Variasi dalam hal ini untuk mendapatkan semua file antara variabel yang diberikan adalah:awk '$0 >= "'"${FROM}"'" && $0 <= "'"${TILL}"'"'
Nickolay
3

Dengan seditu lebih ringkas:

$ find -maxdepth 1 -type f | sort | sed '/^\.\/reference/,$d'

Yang berarti (setelah disortir) menghapus garis referensi (atau lebih besar) dan semua baris mengikuti ke baris terakhir.

Perintah sed 'd' digunakan di sini dengan rentang alamat, di mana '/^./reference/' adalah awal dan '$' adalah akhir dari rentang. (Dan '$' sebagai alamat berarti baris terakhir.)

maxschlepzig
sumber
3

Wajib menjawab zsh, menggunakan . kualifikasi glob untuk memilih hanya file biasa dan euntuk memilih lebih lanjut di antara kecocokan:

echo *(.e\''[[ $REPLY > reference ]]'\')
Gilles 'SANGAT berhenti menjadi jahat'
sumber
3

misalnya. script-name "$HOME" "reference"... findtidak selalu menampilkan yang utama ./, seperti dalam kasus find bin, atau find /tmp. Jadi jika Anda hanya menginginkan nama-nama file, ini berfungsi.

pembaruan: Menambahkan tolower () untuk memungkinkan perbandingan kasus yang tidak sensitif, yang menghasilkan susunan alfabet yang disebutkan dalam pertanyaan ...

#!/bin/bash
dir="$1"; ref="$2"
find "$dir" -maxdepth 1 -type f -printf "%f\n" | awk -v"ref=$ref" 'tolower($0) < tolower(ref)'

Hanya pipa ke sortsetelah awk, jika Anda perlu disortir.

Peter.O
sumber
Ini sepertinya tidak berhasil. Saya mengubah bagian terakhir dari skrip awk menjadi $0 < refdan berfungsi, tetapi karena tidak ada spasi dalam hasil pencarian, bidang $ 2 tidak ada. Apakah saya melewatkan sesuatu?
Mike Deck
Terima kasih, saya membuat perubahan cepat pada saat terakhir, dan melewatkan bidang itu (awalnya memiliki dua bidang dibatasi \ xFF ) ... Sekarang, saya sudah sedikit tidur, saya dapat melihat bahwa itu bukan menangani kasus dengan benar. Saya berasumsi bahwa sebagai pertanyaan mengacu pada susunan alfabet , itu berarti case-sensitive . Saya telah memperbarui jawabannya.
Peter.O