Bagaimana cara mencari semua file yang dimulai dengan nama "ABC" di direktori?

58

Saya perlu mencari file yang dimulai dengan nama tertentu. Mungkin ada banyak file yang dimulai dengan pola tertentu dan saya ingin mendaftar semua file yang ada di direktori.

R11G
sumber

Jawaban:

60

Untuk melengkapi jawaban yang ada:

ls

Utilitas daftar direktori default lsdapat digunakan dalam kombinasi dengan wildcard shell. Untuk mencari semua file dengan pola abc:

ls abc*   # list all files starting with abc---
ls *abc*  # list all files containing --abc--
ls *abc   # list all files ending with --abc

Perhatikan bahwa ekstensi file juga relevan untuk hasil pencarian.


tree

Jika kita perlu membuat daftar file dalam pohon direktori, kita juga dapat mengeluarkan treeuntuk mencari pola tertentu seperti:

tree -P 'abc*'  # list directory tree of file starting with abc---
tree -l 'def*'  # exclude files starting with def---

Dalam hal ini, treeitu sendiri mendukung wildcard.

Takkat
sumber
2
Mengapa ketika saya melakukannya ls -l B*menampilkan isi semua direktori dimulai dengan Bbukan hanya nama direktori yang sesuai?
ErikE
@ErikE Karena ketika Anda meminta lsdaftar direktori, itu membukanya, sama dengan melakukan ls -l BirthdayPhotos. Anda dapat menekan perilaku itu dengan ls -d B*.
Azor Ahai
@AzorAhai Tapi mengapa ini diperlakukan B*sebagai spesifikasi direktori?
ErikE
@ErikE Karena menggunakan file glob, B*memperluas untuk mencocokkan semua direktori yang dimulai dengan Bsehingga Anda benar-benar melewati lsdaftar direktori, sehingga membuka semuanya untuk Anda.
Azor Ahai
1
Tidak menjawab pertanyaan. ls -d ABC*adalah apa yang penulis tanyakan. Juga komentar dalam cuplikan kode salah, ls abc*daftar isi direktori dimulai dengan abc.
greatvovan
42

Anda dapat menggunakan findperintah untuk mencari file dengan pola

find . -type f -name "abc*" 

Perintah di atas akan mencari file yang dimulai dengan abc di bawah direktori kerja saat ini.

-name 'abc'akan mencantumkan file yang sama persis. Misalnya: abc

Anda juga bisa menggunakan

 -iname
 -regex 

opsi dengan findperintah untuk mencari nama file menggunakan pola

devav2
sumber
7

Ada banyak cara untuk melakukannya, tergantung pada apa yang ingin Anda lakukan dengan mereka. Secara umum, jika Anda hanya ingin mendaftarkannya, Anda dapat melakukannya di terminal menggunakan:

find | grep '^\./ABC'

... dan ganti ABCdengan teks Anda.

Untuk memahami perintah, mari kita uraikan sedikit:

  • finddaftar semua file di bawah direktori saat ini dan sub-direktori; menggunakannya sendiri hanya akan mendaftar semuanya di sana. Perhatikan bahwa findoutput setiap file atau direktori dimulai dengan ./, menunjukkan bahwa jalurnya relatif terhadap direktori saat ini. Menyadari hal ini penting karena itu berarti kita akan mencari hasil yang dimulai dengan ./ABCdan bukan hanya ABC.

  • Karakter pipa |mengalihkan output dari satu perintah ke yang lain, dalam hal ini output finddiarahkan ke grep. Ini disebut perpipaan.

  • grepmengambil output dan memfilternya menggunakan pola yang diberikan ^\./ABC,.

    • Perhatikan bahwa polanya dikutip dengan tanda kutip tunggal ' 'untuk mencegah shell menafsirkan karakter khusus di dalamnya.
  • Sekarang polanya sendiri ditulis dalam sintaks tertentu yang disebut regular expression , atau disingkat regex . Regex adalah alat pencarian yang sangat kuat jika Anda menguasainya, dan ada situs seperti ini yang mengajarkan Anda tentang hal itu secara lebih mendalam, tetapi perhatikan bahwa grepitu bukan mesin regex yang lengkap dan Anda tidak dapat melakukan semuanya dengan itu.

  • Untuk tujuan kami:

    • ^di regex cocok dengan awal string; ini mencegahnya dari mencocokkan pola jika itu tidak terjadi di awal nama file.

    • .di regex memiliki arti khusus juga: itu berarti "cocok dengan karakter tunggal apa pun di sini". Jika Anda ingin menggunakannya sebagai titik literal, Anda harus "melarikan diri" menggunakan backslash \sebelum itu. (Ya, mencocokkan karakter apa pun tidak akan berbahaya dalam kasus kami, tapi aku melakukannya demi kelengkapannya.)

Yamaho
sumber
1
Mengapa Anda find | grepketika findmemiliki kemampuan pencocokan pola sendiri yang sangat baik?
Darael
3

Anda dapat menggunakan GREP, saya pikir ini adalah solusi paling sederhana, mungkin juga menambahkan beberapa parameter grep lainnya untuk membuat pertandingan lebih akurat

tree | grep ABC
Tomáš Tibenský
sumber
2

Anda dapat mencari pola tertentu menggunakan pengelola file Nautilus dan ekspresi reguler.

Untuk melakukannya, klik Pilih Pencocokan Item di menu Gear seperti di bawah ini (Anda juga dapat menekan Ctrl+ s).

masukkan deskripsi gambar di sini

Kemudian, cukup ketik ekspresi reguler ABC* dan validasi.

masukkan deskripsi gambar di sini

Setiap file yang namanya cocok dengan pola Anda akan dipilih secara otomatis.

masukkan deskripsi gambar di sini

Saya menggunakan Nautilus 3.6. * Dari GNOME3 PPA di Ubuntu 12.10 (Quantal).

remjg
sumber
1

Solusi termudah bagi saya

ls | grep PATTERN

Di sini Anda dapat memberikan ekspresi reguler apa pun di POLA.

Misalnya, untuk menemukan file dengan "ab" di mana saja di dalam namanya, ketikkan

ls | grep ".*ab.*"

Untuk menemukan file yang dimulai dengan "ab", ketik

ls | grep "^ab"
Preetom Saha Arko
sumber
1

Jika Anda tidak tahu direktori tempat ABC*file berada, dan Anda memiliki jutaan file, locateperintahnya adalah metode tercepat.

$ locate /ABC
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABC6AD2FEC16465049B48D39FD2FE538258F2A34
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABCBFDA54262F47253F95ED6ED4131A465EE0E39
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh
/mnt/old/home/rick/.cache/mozilla/firefox/3vkvi6ov.default/cache2/entries/ABC0C99FCEABAD0C6AA2078CD025A1CDE48D7BA1
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh

Catatan:

  • Perintah di atas membutuhkan waktu 1 detik untuk dijalankan pada 1 juta file.
  • Sebagai perbandingan, findperintah yang dimulai pada /direktori root akan sangat lama dan menghasilkan banyak kesalahan izin.
  • Jika file dibuat hari ini, Anda harus menjalankannya sudo updatedbterlebih dahulu.
WinEunuuchs2Unix
sumber
0

saya menggunakan

ls | grep abc

atau

ls -la | grep abc

Ini menunjukkan semua file dengan abc, tidak hanya dimulai dengan abc. Tapi, ini cara yang sangat mudah bagi saya untuk melakukan ini.

Mariano Cali
sumber
0

Python:

$ python -c 'import sys,os;found=[os.path.join(r,i) for r,s,f in os.walk(".") for i in f if i.startswith("ABC")];map(lambda x: sys.stdout.write(x+"\n") ,found)'

Perl:

$ perl -le 'use File::Find;find(sub{ -f && $_ =~/^ABC/ && print $File::Find::name  },".")' 
Sergiy Kolodyazhnyy
sumber
0
printf "%s" /path/to/files/ABC*

Ini adalah pencocokan pola glob yang berlabuh di kedua ujungnya. Ini akan cocok dengan semua kemunculan file yang dimulai dengan "ABC" seperti "ABC", "ABC.txt", "ABC123", tetapi tidak "xABC". Dari baris perintah menggunakan 'ls' sebagai pengganti 'printf' di sini adalah alternatif yang aman, namun tergantung pada pendapat siapa Anda setuju, 'ls' tidak aman untuk digunakan dalam skrip. Dalam hal menggunakan 'printf' dengan pencocokan pola glob dianggap aman. Jika Anda akan menggunakan ini dalam skrip, output dari 'printf' tidak akan berisi karakter baris baru sampai akhir aliran output sebagai berikut:

printf "%s" /path/to/files/ABC*  

Pengembalian:

/path/to/files/ABC /path/to/files/ABC123

Jika Anda membutuhkan jeda baris setelah setiap contoh:

printf "%s\n" /path/to/files/ABC*

Pengembalian:

/path/to/files/ABC 

/path/to/files/ABC123

"/ path / to / files /" tetap di output jika Anda memasukkannya saat Anda menjalankan perintah 'printf'. Tanpa itu hanya nama file yang muncul:

printf "%s" ABC* 

Kembali

ABC ABC123

Dengan asumsi Anda menjalankan perintah di dalam direktori di mana file ada.

MasukkanUserNameHere
sumber
Itu echo /path/to/files/ABC* | tr " " "\n"bukan ide yang bagus. Pertimbangkan jika ada file /path/to/files/ABC EFG, ada spasi di nama file. Anda trakan memecah nama file menjadi dua baris terpisah, yang tidak bagus. Lebih buruk lagi jika ada beberapa spasi dalam nama file. Saya akan merekomendasikan Anda menggunakannya printf "%s\n" ABC*sebagai gantinya, yang seharusnya membantu dengan spasi dalam nama file, tetapi masih bermasalah dengan karakter khusus lainnya seperti\n
Sergiy Kolodyazhnyy
0

Command-t di salah satu plugin vim favorit saya, plugin berbasis ruby ​​di atas integrasi dengan FZF.

Dengan menggunakan Comamnd-T dan FZF Anda dapat melakukan pencarian dengan mekanisme "fuzzy" yang sangat cepat untuk:

  • Membuka file dan buffer
  • Melompat ke tag dan membantu
  • Menjalankan perintah, atau pencarian dan perintah sebelumnya
  • dengan sedikit penekanan tombol.

Seperti yang terlihat

masukkan deskripsi gambar di sini

Saya selalu mencari dalam sejarah perintah dengan membuka terminal baru dan tekan:

CTRL+R

Selain mencari di semua folder secara rekursif dengan menulis di tab terminal apa pun:

fzf

Kemudian mulailah nama file Anda

ABC

Anda juga dapat menulis di dalamnya vim

:CommandT 

Sangat membantu terutama di folder besar.

HMagdy
sumber
0

Anggaplah saya berada di direktori root dan saya ingin daftar direktori dll saja: kita menulis,

find -type d -name "etc"

hasil yang kami dapatkan,

[root@unix /]# find -type d -name "etc"

./etc
./usr/lib/firefox/bundled/etc
./usr/lib/unix-yarn/etc
./usr/lib/unix/etc
./usr/lib/festival/etc
./usr/bin/lib/vmware-tools/lib64/libconf/etc
./usr/bin/lib/vmware-tools/lib32/libconf/etc
./usr/etc
./usr/share/doc/oddjob-0.30/sample/etc
./usr/share/festival/lib/etc
./usr/local/etc
./usr/java/jdk1.7.0_25/lib/visualvm/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib64/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib32/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/caf/etc

Contoh lain,

Kita juga bisa menulis:

ls | grep "etc"

kita mendapatkan,

etc
Bhaskar Das
sumber