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?

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}'

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.)



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.


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
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.