Hasil temuan normal menggunakan find . ! -path "./build*" -name "*.txt"
:
./tool/001-sub.txt
./tool/000-main.txt
./zo/001-int.txt
./zo/id/002-and.txt
./as/002-mod.txt
dan ketika disortir dengan sort -n
:
./as/002-mod.txt
./tool/000-main.txt
./tool/001-sub.txt
./zo/001-int.txt
./zo/id/002-and.txt
namun output yang diinginkan adalah:
./tool/000-main.txt
./zo/001-int.txt
./tool/001-sub.txt
./zo/id/002-and.txt
./as/002-mod.txt
yang berarti output diurutkan berdasarkan nama file saja , tetapi informasi folder harus dipertahankan sebagai bagian dari output.
Sunting : Jadikan contoh lebih rumit karena struktur subdirektori dapat mencakup lebih dari satu level.
-printf
bukanawk
), saya pikir itu adalah solusi terbaik. Saya telah mengerjakan ulang implementasi asli saya untuk menggunakan metode ini.Jawaban:
Anda perlu mengurutkan berdasarkan bidang terakhir (mempertimbangkan
/
sebagai pemisah bidang). Sayangnya, saya tidak bisa memikirkan alat yang bisa melakukan ini ketika jumlah bidang bervariasi (jika hanyasort -k
bisa mengambil nilai negatif).Untuk menyiasatinya, Anda harus melakukan penghias-sort-undecorate. Yaitu, ambil nama file dan letakkan di awal diikuti oleh pemisah bidang, lalu lakukan pengurutan, lalu hapus kolom pertama dan pemisah bidang.
Bahwa
awk
perintah mengatakan pemisah lapanganFS
diatur ke/
; ini mempengaruhi cara membaca bidang. The pemisah output fieldOFS
juga diatur untuk/
; ini mempengaruhi cara mencetak catatan. Pernyataan berikutnya mengatakan cetak kolom terakhir (NF
adalah jumlah bidang dalam catatan, sehingga juga merupakan indeks dari bidang terakhir) serta seluruh catatan ($0
adalah seluruh catatan); itu akan mencetaknya dengan OFS di antara mereka. Kemudian daftarnyasort
diedit, diperlakukan/
sebagai pemisah bidang - karena kita memiliki nama file pertama dalam catatan, itu akan mengurutkan berdasarkan itu. Kemudiancut
hanya bidang cetak 2 yang berakhir, yang lagi diperlakukan/
sebagai pemisah bidang.sumber
-printf '%f/%p\n'
Saya akan menggunakan file '-printf' untuk menampilkan nama dan jalur, mengurutkan berdasarkan nama, dan memotong nama pada langkah terakhir. '###' hanyalah penanda, untuk membantu memotong.
% f mencetak nama file,% p seluruh path.
Saya menyederhanakan perintah find untuk membuatnya menjadi satu baris, tentu saja Anda akan meninggalkan
! -path "./build*"
bagian itu.sumber
Dalam zsh ≥4.3.10:
**/*.txt
cocok*.txt
di direktori saat ini dan subdirektori secara rekursif .~build*
mengecualikan kecocokan yang teksnya dimulai denganbuild*
(seperti! -path './build*'
). (Anda perlusetopt extended_glob
terlebih dahulu.)(oe\''…'\')
adalah kualifikasi glob sorting .REPLY=…
membangun string untuk disortir dari string untuk kembali.${REPLY:t}
adalah basename ( “ekor”) dari jalan.sumber