menemukan perintah penyortiran perintah default

30

apa urutan penyortiran default untuk entri yang dikembalikan oleh perintah find linux?

Misalnya, jika saya menerbitkan

find . -type f -name '*mp3' 

dan output terdiri dari banyak file di beberapa sub-folder, apa urutan default direktori mana yang terdaftar? Pada saat yang sama, apa urutan pengurutan di mana file dalam direktori individu terdaftar?

Terkadang ia kembali:

./B/01.mp3
./A/01.mp3
./A/04.mp3
./A/02.mp3

Lihat bagaimana pertama kali isi direktori B terdaftar, kemudian direktori A. Pada saat yang sama dalam direktori A, file-file terdaftar dalam urutan yang lucu.

Nasko
sumber
Dari pengalaman tampaknya konsisten per instal, yaitu. jika Anda memiliki set file yang sama pada dua mesin, itu akan selalu mengembalikan satu urutan pada satu mesin, dan yang sama sekali berbeda di yang lain. Saya bertanya-tanya mengapa sebelumnya, +1
James L
1
Saya memiliki pemancar FM di mobil saya dan selalu memutar lagu dari kartu flash saya dalam urutan yang aneh. Saya tidak pernah mengira, tapi saya tahu itu persis urutan yang sama di mana perintah di atas mengembalikan hasilnya
Nasko
BTW: BSD find memiliki -sparameter untuk mengurutkan output berdasarkan abjad.
Lapo

Jawaban:

19

findakan melintasi pohon direktori dalam urutan item disimpan dalam entri direktori. Ini (sebagian besar) akan konsisten dari menjalankan ke menjalankan, pada mesin yang sama dan pada dasarnya akan menjadi "urutan pembuatan file / direktori" jika tidak ada penghapusan.

Namun, beberapa sistem file akan memesan ulang entri direktori sebagai bagian dari operasi pemadatan atau ketika ukuran entri perlu diperluas, sehingga selalu ada kemungkinan kecil pesanan "mentah" akan berubah seiring waktu. Jika Anda menginginkan pesanan yang konsisten, masukkan output melalui tahap penyortiran ekstra.

Vatine
sumber
Terima kasih atas jawaban terinci Anda! Jadi, jika pemancar FM saya (lihat komentar saya sebelumnya) memainkan trek dalam urutan perintah find akan mencantumkannya, saya tidak dapat mengontrol dalam urutan apa saya ingin mereka dimainkan.
Nasko
Nah, kartu flash mungkin menggunakan sistem file FAT dan jika saya ingat dengan benar, memanipulasi urutan entri FAT cukup mudah dengan debugger sistem file. Mungkin, layak menyalin lagu-lagu dari flash saat ini ke flash baru, dalam urutan yang Anda inginkan dimainkan, itu mungkin lebih mudah.
Vatine
Salah satu aplikasi yang berguna dari konsistensi semacam itu adalah estimasi progres lambat find /path/ -exec ...dengan berjalan jauh lebih cepat find /path/untuk mendapatkan daftar file yang diurutkan terlebih dahulu.
Andrey
6

Anda tidak harus bergantung pada urutan keluaran tertentu dari finddan sebaliknya harus menggunakan sortdan cara lain untuk secara khusus mengontrol pesanan.

Dijeda sampai pemberitahuan lebih lanjut.
sumber
2

Saya telah bekerja di UNIX / Linux sejak 1984/1991 masing-masing dan perintah pertama yang diajarkan kepada saya adalah find. Linux / GNU telah memasukkan hampir semua yang Anda butuhkan ke perintah find saat ini, jadi ikutilah.

Berikut adalah beberapa tips bermanfaat untuk menyortir hasil pencarian. Opsi -printf memberi Anda banyak opsi untuk mengaktifkan penyortiran dan presentasi info file yang lebih kompleks. Itu yang terbaik untuk masalah seperti ini. Mainkan dengan itu untuk melihat apa yang akan bekerja untuk Anda. Menggunakan -printf Anda dapat menyesuaikan dan membatasi hasil seperti yang Anda inginkan. Ini sedikit membantu ketika Anda perlu memposting proses hasilnya. Saya harap ini membantu seseorang.

  1. Jika Anda menggunakan -l dan ingin mengurutkan berdasarkan nama file, bidang ke-11 adalah nama file sehingga Anda dapat melakukan hal berikut. Opsi sort -k dapat mengambil banyak bidang untuk mengurutkan juga.

    temukan / path -l | semacam -k11

  2. Jika Anda ingin kontrol kendali butir yang lebih baik berdasarkan tanggal / waktu dalam urutan naik atau turun, gunakan opsi "" printf. Lihat manual untuk lebih detail, tetapi berikut ini adalah contoh yang akan dicetak dengan pecahan detik sehingga sangat akurat.

CONTOH TANGGAL / WAKTU: 2016-09-17 + 12: 09: 57.9013929800

find /path -printf "%T+ %p\n" | sort -n # Ascending

find /path -printf "%T+ %p\n" | sort -nr # Descending

Cara lain untuk melakukan ini tanpa karakter dalam string tanggal / waktu adalah.

CONTOH TANGGAL / WAKTU: 20160917120013.8101685040

find /path -printf "%AY%Am%Ad%AH%AM%AS %p\n" | sort -n
David Conger-Eldeen
sumber