Temukan file dengan panjang nama file

10

Saya ingin mencari semua file dengan panjang nama file.

Sebagai contoh jika saya ingin mencari file panjang 1, seperti a.go, b.go.

Saya meletakkan:

grep '.\{1\}' file

Tetapi ini tidak berhasil. Perintah apa yang dapat saya gunakan untuk mencari file berdasarkan panjang nama file?

EPSILONsdfsdfdsf
sumber
a.goadalah nama file dengan panjang 4. aadalah nama file dengan panjang 1. Ini adalah Unix, bukan DOS di mana nama dan ekstensi terpisah dan implisit .selalu menjadi bagian dari nama file.
Peter Cordes

Jawaban:

3

grepmencari pola dalam isi file. Jika Anda ingin melihat nama - nama file, Anda bisa menggunakan shell glob (jika Anda ingin mempertimbangkan hanya nama file di direktori saat ini):

echo ?.go

(Ngomong-ngomong, itu shell yang mengevaluasi glob, bukan echoperintah.)

Jika Anda ingin melihat direktori secara berulang, dimulai dengan direktori saat ini, alat yang digunakan adalah find:

find . -name '?.go'

(Perhatikan bahwa Anda harus mengutip pola untuk mencegah shell mengevaluasinya sebagai gumpalan sebelum finddipanggil.)

200_sukses
sumber
1
Ini juga akan menemukan direktori yang juga cocok dengan pola '? .Go'.
slm
@slm, direktori adalah salah satu dari banyak jenis file, OP tidak menentukan jenis file apa yang dia cari.
Stéphane Chazelas
8

Jika Anda hanya ingin menemukan nama file, Anda dapat menggunakan perintah berikut:

find -exec basename '{}' ';' | egrep '^.{100,}$'

Itu akan berjalan find, mengeluarkan nama file atau direktori menggunakan basenamedan kemudian mencari nama file atau direktori yang setidaknya 100 karakter. Jika Anda ingin mencari nama file dengan panjang yang tepat, gunakan {100}sebagai ganti {100,}.

Jika Anda ingin menemukan nama file termasuk path, lakukan ini:

find | egrep '/[^/]{100,}$'

Ini akan mengembalikan nama file termasuk jalur relatif ke tempat Anda menjalankan perintah find.

Doug Harple
sumber
3

Pertama-tama, grepmencari 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 sedperintah hanya menghilangkan ./. The -Pbendera 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.

terdon
sumber
1

Anda tidak menentukan tetapi jika file berada dalam struktur direktori yang dapat Anda gunakan finduntuk mencari file yang panjangnya 1, dengan bantuan grep:

$ find . -type f  | grep -P '/.{1}\.'

Contoh

$ find . -type f  | grep -P '/.{1}\.' | head -10
./util-linux-2.19/include/c.h
./88366/a.bash
./89186/a.bash
./89563/b.txt
./89563/a.txt
./89563/c.txt
./89563/d.txt
./91734/2.c
./91734/4.c
./91734/1.c
slm
sumber
Di MacOS X, gunakan egrep dan hapus opsi -P
Bart Kummel
@ BartKummel - sebenarnya di OSX saya menggunakan ggrep: heystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html . Sadari juga bahwa Q ini tidak ditandai sebagai OSX sehingga penggunaannya greptepat.
slm
1

Saya akan menggunakan sesuatu seperti ini.

find . -type f -name "?.go"

Jadi, jika Anda menempatkan dua "?" maka Anda mencari nama file dengan dua karakter dan ekstensi.

Purinda Gunasekara
sumber
0

Saat Anda ingin menggunakan pengekspresian reguler dalam perintah find, Anda harus menggunakan ""seperti:

find /var/log -iname "*.err" 

untuk penggunaan kasus Anda:

find yourpath -type f -a -name "?.go"

Anda harus mengganti jalur Anda yang sebenarnya dengan jalur Anda, -aberarti And -type fAnda hanya mencari file biasa.

? dalam permintaan Anda berarti satu karakter pembajak seperti DOS jika Anda ingat.

Teluk Persia
sumber
-1

ls ?.* harus memberi Anda hasil yang diinginkan.

Nitin Gupta
sumber
selamat datang di Unix.SE. Sayangnya tidak berguna untuk menambahkan jawaban ke pertanyaan lama yang sudah memiliki banyak jawaban bagus. (Kecuali jika ada cara baru yang lebih baik untuk menyelesaikan masalah lama, atau Anda memiliki solusi yang lebih baik daripada jawaban lama mana pun.) Jika Anda ingin menjawab beberapa pertanyaan, lihatlah pertanyaan-pertanyaan baru di halaman depan.
Peter Cordes