Jawaban:
Untuk melengkapi jawaban yang ada:
ls
Utilitas daftar direktori default ls
dapat 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 tree
untuk 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, tree
itu sendiri mendukung wildcard.
ls
daftar direktori, itu membukanya, sama dengan melakukan ls -l BirthdayPhotos
. Anda dapat menekan perilaku itu dengan ls -d B*
.
B*
sebagai spesifikasi direktori?
B*
memperluas untuk mencocokkan semua direktori yang dimulai dengan B
sehingga Anda benar-benar melewati ls
daftar direktori, sehingga membuka semuanya untuk Anda.
ls -d ABC*
adalah apa yang penulis tanyakan. Juga komentar dalam cuplikan kode salah, ls abc*
daftar isi direktori dimulai dengan abc.
Anda dapat menggunakan find
perintah 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 find
perintah untuk mencari nama file menggunakan pola
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 ABC
dengan teks Anda.
Untuk memahami perintah, mari kita uraikan sedikit:
find
daftar semua file di bawah direktori saat ini dan sub-direktori; menggunakannya sendiri hanya akan mendaftar semuanya di sana. Perhatikan bahwa find
output 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 ./ABC
dan bukan hanya ABC
.
Karakter pipa |
mengalihkan output dari satu perintah ke yang lain, dalam hal ini output find
diarahkan ke grep
. Ini disebut perpipaan.
grep
mengambil output dan memfilternya menggunakan pola yang diberikan ^\./ABC
,.
' '
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 grep
itu 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.)
find | grep
ketika find
memiliki kemampuan pencocokan pola sendiri yang sangat baik?
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
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).
Kemudian, cukup ketik ekspresi reguler ABC*
dan validasi.
Setiap file yang namanya cocok dengan pola Anda akan dipilih secara otomatis.
Saya menggunakan Nautilus 3.6. * Dari GNOME3 PPA di Ubuntu 12.10 (Quantal).
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"
Jika Anda tidak tahu direktori tempat ABC*
file berada, dan Anda memiliki jutaan file, locate
perintahnya 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:
find
perintah yang dimulai pada /
direktori root akan sangat lama dan menghasilkan banyak kesalahan izin.sudo updatedb
terlebih dahulu.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.
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 },".")'
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.
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 tr
akan 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
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:
Seperti yang terlihat
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.
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
ls -l B*
menampilkan isi semua direktori dimulai denganB
bukan hanya nama direktori yang sesuai?