Saya memiliki banyak file dari log1
hingga log164
.
Saya mencoba untuk MENDAFTAR direktori (diurutkan) di terminal UNIX tetapi fungsi pengurutan hanya menyediakan format seperti ini:
home:logs Home$ ls -1 | sort
log1.gz
log10.gz
log100.gz
log101.gz
log102.gz
log103.gz
log104.gz
log105.gz
log106.gz
...etc
Yang saya inginkan adalah
home:logs Home$ ls -1 | sort
log1.gz
log2.gz
log3.gz
log4.gz
log5.gz
log6.gz
log7.gz
...{more here}
log99.gz
log100.gz
log101.gz
log102.gz
...etc
Adakah saran yang bisa saya gunakan untuk melakukan ini?
log1.gz
melaluilog164.gz
, maka apa yang Anda bahkan perluls -1
mereka untuk?ls -1
dilakukan: daftar nama file. Karena Anda sudah tahu nama file, saya tidak mengerti untuk apa Anda membutuhkannya. Tetapi karena Anda telah menerima jawaban Kevin, sekarang saya tahu: Anda tidak membutuhkannya. Yang lebih masuk akal. :-)Jawaban:
bash
Kawat gigi{}
,, akan menghitungnya dalam urutan:sumber
Mengapa tidak menggunakan
ls
fitur bawaan untuk kasus khusus ini, yaitu-v natural sort of (version) numbers within text
Sebagai contoh
ls -1v log*
sumber
sort
, jika seseorang memiliki serangkaian string daripada direktori file-v - Force unedited printing of non-graphic characters
.ls | sort -n
Dengan GNU ls (yaitu di Linux, Cygwin, atau sistem lain yang memiliki GNU ls khusus diinstal):
Dalam zsh:
Dalam cangkang lain:
Ganti
echo
denganprintf '%s\n'
jika Anda ingin setiap nama file pada baris terpisah.Jika Anda menginginkan metadata file juga (
ls -l
) dan Anda tidak memiliki GNU ls, Anda harus memanggills
secara terpisah untuk setiap nama file atau grup nama file yang ingin Anda lihat dalam urutan leksikografis.Untuk menghindari kesulitan ini, gunakan angka nol terkemuka di nama file Anda sehingga jenis leksikografis ramah-manusia (
log001.gz
, dll.).sumber
Meskipun solusinya
ls -1v
tentu yang paling baik dalam kasus ini, saya pikir itu baik untuk memiliki satu yang berfungsisort
seperti pada pertanyaan awal, karena ini juga berfungsi ketika input Anda tidak berasalls
. Dalam hal ini Anda dapat menggunakan:The
-n
pilihan memberitahu sort untuk mengurutkan numerik, dan-k 1.4
menetapkan kunci semacam untuk field pertama (yang merupakan seluruh nama file dalam hal ini) mulai dari karakter ke-4 sampai dengan yang terakhir.sumber
ls -1 | sort -n -k1.4
tidak berfungsi. Ini memberikan yang tidak disortir pada awalnya hingga 4 karakter kemudian disortir setelah karakter ke-4. Saya menggunakanls -1 |sort | sort -n -k1.4
dan itu bekerja dengan sempurna.sort -k1.1,1.3 -k1.4n
.sort
implementasi tidak harus stabil sehingga pendekatan Anda tidak akan bekerja dengan semua implementasi. Lihat juga-V
opsi GNU dan FreeBSDsort
.GNU
sort
(sebagaimana tersedia di Linux,) memiliki mode "versi sortir" yang menginterpretasikan angka-angka di dalam angka-bukan seperti yang Anda minta:Dari
man 1 sort
:(Membuat file tes kosong ke daftar
touch log1.gz log2.gz log3.gz log99.gz log100.gz log101.gz log102.gz
:)Kasing contoh Anda, menambahkan
-V
opsi (atau--version-sort
):sumber
jika Anda menggunakan Mac atau BSD coba ini:
sumber
Versi Solaris saya tidak mendukung
ls -v
(grrr). Dan solusi pengurutan yang disediakan di atas 1) membutuhkan pengetahuan tentang posisi digit dalam nama file, dan 2) tidak menangani hal-hal seperti nomor versi multi-bagian.Pendekatan di bawah ini kompatibel dengan Solaris, tidak memerlukan pengetahuan awal tentang posisi digit, dan menangani nomor versi dengan 2, 3 atau 4 komponen (seperti: a-1.2, foo-5.6.7, bar_baz_9.10.11.12). Ini juga digunakan
sort -f
untuk melipat huruf besar dan kecil bersama-sama, dan dengan benar menangani direktori yang dicampur dengan file:ls -d | sort -f -t . -k 1,1 -k 2,2n -k 3,3n -k 4,4n
Perhatikan bahwa versi ini membatasi komponen pertama menjadi satu digit.
Jika sistem operasi target Anda mendukung
ls -v
, itu jelas merupakan solusi yang unggul.sumber
Solusi Perl:
sumber
sumber
-t .
berlebihan di sini.Ini berhasil untuk saya.
Saya punya file 1.jpg 2.jpg ... 18.jpg
$ echo *.jpg | tr -s ' ' '\n' | sort -n
sort
semakin bingung denganls
output karena karakter warna yang tidak patut dicetak. Jika Anda mencoba ini:ls -1 --color=none *.jpg | sort -n
ini akan bekerja dengan sempurna.
sort
dapat mengabaikan karakter yang tidak diinginkan dengan-i
opsi tetapi masih tidak berfungsi dan saya tidak tahu mengapa.Tetapi Anda selalu dapat menghapus warna seperti ini dan
sort
akan bekerja:ls -1 --color=always *.jpg | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" | sort -n
Saya berharap suatu hari
sort
akan memiliki opsi untuk ini.sumber