Pertama-tama, grep
mencari melalui isi file, itu tidak akan mencari nama file. Untuk itu kamu mau find
. Itu tidak memiliki opsi untuk mengatur panjang nama file tetapi Anda dapat menguraikan output untuk mendapatkan apa yang Anda inginkan. Berikut adalah beberapa contoh yang saya jalankan di direktori yang berisi file-file berikut:
$ tree
.
├── a
├── ab
├── abc
├── abcd
└── dir
├── a
├── ab
├── abc
└── abcd
Mencari file di direktori ini menghasilkan:
$ find . -type f | sort
./a
./ab
./abc
./abcd
./dir/a
./dir/ab
./dir/abc
./dir/abcd
Jadi, untuk menemukan file dengan panjang X, kita harus menghapus path dan hanya mencocokkan karakter setelah yang terakhir /
:
$ find . -type f | grep -P '/.{3}$'
The sed
perintah hanya menghilangkan ./
. The -P
bendera mengaktifkan Perl Regular Expressions Kompatibel yang diperlukan untuk {n}
yang merupakan hal yang PCRE dan $
berarti "cocok dengan akhir string".
Anda juga bisa melakukan ini:
find . -type f | grep -P '/...$'
Itu bagus untuk angka kecil mengetik 15 titik untuk mencocokkan nama file dengan panjang 15 tidak sangat efisien.
Terakhir, jika Anda ingin mengabaikan ekstensi dan hanya mencocokkan nama file, lakukan ini (seperti yang disarankan @slm):
find . -type f | grep -P '/.{1}\.'
Namun, ini juga akan menemukan file seperti a.bo.go
. Ini lebih baik jika nama file Anda dapat mengandung lebih dari satu .
:
find . -type f | grep -P '/.{1}\.[^.]+$'
CATATAN: Solusi di atas mengasumsikan bahwa Anda memiliki nama file yang relatif waras yang tidak mengandung karakter baris baru, dll. Ini juga akan menghitung tidak mengabaikan spasi dalam nama file saat menghitung panjang yang mungkin bukan yang Anda inginkan. Jika salah satu dari ini adalah masalah, beri tahu saya dan saya akan memperbarui jawaban saya.
a.go
adalah nama file dengan panjang 4.a
adalah nama file dengan panjang 1. Ini adalah Unix, bukan DOS di mana nama dan ekstensi terpisah dan implisit.
selalu menjadi bagian dari nama file.