Câu trả lời:
Để hoàn thành các câu trả lời hiện có:
ls
Tiện ích danh sách thư mục mặc định ls
có thể được sử dụng kết hợp với các ký tự đại diện của shell. Để tìm kiếm tất cả các tệp có mẫu abc
:
ls abc* # list all files starting with abc---
ls *abc* # list all files containing --abc--
ls *abc # list all files ending with --abc
Lưu ý rằng phần mở rộng tập tin cũng phù hợp với kết quả tìm kiếm.
tree
Trong trường hợp chúng ta cần liệt kê các tệp trong cây thư mục, chúng ta cũng có thể phát hành tree
để tìm kiếm một mẫu nhất định như:
tree -P 'abc*' # list directory tree of file starting with abc---
tree -l 'def*' # exclude files starting with def---
Trong trường hợp này, tree
chính nó hỗ trợ ký tự đại diện.
ls
liệt kê một thư mục, nó sẽ mở ra, nó giống như làm ls -l BirthdayPhotos
. Bạn có thể ngăn chặn hành vi đó với ls -d B*
.
B*
là một đặc tả thư mục?
B*
sẽ mở rộng để khớp với tất cả các thư mục bắt đầu B
để bạn thực sự vượt qua ls
một danh sách các thư mục, vì vậy nó sẽ mở tất cả chúng cho bạn.
ls -d ABC*
là những gì tác giả đã hỏi về. Ngoài ra các bình luận trong đoạn mã là sai, ls abc*
liệt kê nội dung của các thư mục bắt đầu bằng abc.
Bạn có thể sử dụng find
lệnh để tìm kiếm các tệp có mẫu
find . -type f -name "abc*"
Lệnh trên sẽ tìm kiếm tệp bắt đầu bằng abc trong thư mục làm việc hiện tại.
-name 'abc'
sẽ liệt kê các tập tin phù hợp chính xác. Vd: abc
Bạn cũng có thể dùng
-iname
-regex
tùy chọn với find
lệnh để tìm kiếm tên tệp bằng cách sử dụng một mẫu
Có nhiều cách để làm điều đó, tùy thuộc vào chính xác những gì bạn muốn làm với chúng. Nói chung, nếu bạn muốn chỉ liệt kê chúng, bạn có thể làm điều đó trong một thiết bị đầu cuối bằng cách sử dụng:
find | grep '^\./ABC'
... và thay thế ABC
bằng văn bản của bạn.
Để hiểu lệnh, hãy phá vỡ nó một chút:
find
liệt kê tất cả các tập tin trong thư mục hiện tại và các thư mục con của nó; sử dụng nó một mình sẽ chỉ liệt kê tất cả mọi thứ ở đó. Lưu ý rằng find
đầu ra mỗi tệp hoặc thư mục bắt đầu bằng ./
, chỉ ra rằng đường dẫn của chúng có liên quan đến thư mục hiện tại. Nhận thức được điều này rất quan trọng vì nó có nghĩa là chúng tôi sẽ tìm kiếm kết quả bắt đầu ./ABC
và không chỉ ABC
.
Ký tự ống |
chuyển hướng đầu ra của một lệnh này sang lệnh khác, trong trường hợp này, đầu ra của find
được chuyển hướng đến grep
. Điều này được gọi là đường ống.
grep
lấy đầu ra và lọc nó bằng cách sử dụng mẫu đã cho , ^\./ABC
.
' '
để ngăn shell diễn giải các ký tự đặc biệt bên trong nó.Bây giờ, chính mẫu được viết theo một cú pháp cụ thể gọi là biểu thức chính quy hoặc viết tắt là regex . Regex là một công cụ tìm kiếm cực kỳ mạnh mẽ nếu bạn thành thạo nó, và có những trang như trang này dạy bạn về nó sâu hơn, nhưng lưu ý rằng đó grep
không phải là một công cụ regex chính thức và bạn không thể làm mọi thứ với nó.
Vì mục đích của chúng tôi:
^
trong regex khớp với phần đầu của chuỗi; điều này ngăn nó khớp với mẫu nếu nó không xuất hiện ở đầu tên tệp.
.
trong regex cũng có một ý nghĩa đặc biệt: nó có nghĩa là "khớp với bất kỳ ký tự đơn nào ở đây". Trong trường hợp bạn muốn sử dụng nó như một dấu chấm, bạn sẽ phải "thoát" nó bằng dấu gạch chéo ngược \
trước nó. (Vâng, phù hợp với bất kỳ nhân vật nào sẽ vô hại trong trường hợp của chúng tôi, nhưng tôi đã làm điều đó vì sự hoàn chỉnh.)
find | grep
khi find
có khả năng mô hình-phù hợp một cách hoàn hảo tốt của riêng mình?
bạn có thể sử dụng GREP, tôi nghĩ đây là giải pháp đơn giản nhất, có lẽ cũng thêm một số thông số grep khác để làm cho trận đấu chính xác hơn
tree | grep ABC
Bạn có thể tìm kiếm một mẫu cụ thể bằng trình quản lý tệp Nautilus và các biểu thức thông thường.
Để làm như vậy, nhấp vào Chọn Mục phù hợp trong menu Gear như bên dưới (bạn cũng có thể nhấn Ctrl+ s).
Sau đó, chỉ cần gõ biểu thức chính quy ABC*
và xác nhận.
Mỗi tệp có tên phù hợp với mẫu của bạn sẽ được chọn tự động.
Tôi đang sử dụng Nautilus 3.6. * Từ GNOME3 PPA trên Ubuntu 12.10 (Định lượng).
Giải pháp đơn giản nhất với tôi
ls | grep PATTERN
Ở đây bạn có thể đưa ra bất kỳ biểu thức chính quy nào trong MẪU.
Ví dụ: để tìm tệp có "ab" ở bất cứ đâu trong tên của nó, hãy nhập
ls | grep ".*ab.*"
Để tìm các tệp bắt đầu bằng "ab", nhập
ls | grep "^ab"
Nếu bạn không biết thư mục ABC*
các tệp được đặt trong đó và bạn có hàng triệu tệp, locate
lệnh là phương pháp nhanh nhất.
$ 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
Ghi chú:
find
lệnh bắt đầu từ /
thư mục gốc sẽ rất lâu và tạo ra nhiều lỗi cấp phép.sudo updatedb
đầu tiên.tôi sử dụng
ls | grep abc
hoặc là
ls -la | grep abc
Nó hiển thị tất cả các tập tin với abc, không chỉ bắt đầu với abc. Nhưng, đó là cách thực sự dễ dàng đối với tôi để làm điều này.
Con trăn:
$ 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*
Đây là kết hợp mô hình toàn cầu được neo ở cả hai đầu. Điều này sẽ khớp với tất cả các lần xuất hiện của các tệp bắt đầu bằng "ABC", chẳng hạn như "ABC", "ABC.txt", "ABC123", nhưng không phải là "xABC". Từ dòng lệnh sử dụng 'ls' thay cho 'printf' ở đây là một sự thay thế an toàn, tuy nhiên, tùy thuộc vào ý kiến của bạn mà bạn đồng ý, 'ls' không an toàn để sử dụng trong tập lệnh. Trong trường hợp đó, sử dụng 'printf' với khớp mẫu toàn cục được coi là an toàn. Nếu bạn sẽ sử dụng điều này trong một tập lệnh, đầu ra của 'printf' sẽ không chứa một ký tự dòng mới cho đến khi kết thúc luồng đầu ra như sau:
printf "%s" /path/to/files/ABC*
Trả về:
/path/to/files/ABC /path/to/files/ABC123
Nếu bạn cần ngắt dòng sau mỗi trường hợp:
printf "%s\n" /path/to/files/ABC*
Trả về:
/path/to/files/ABC
/path/to/files/ABC123
"/ Path / to / files /" vẫn ở đầu ra nếu bạn nhập theo cách đó khi bạn chạy lệnh 'printf'. Không có nó, tên tệp sẽ xuất hiện:
printf "%s" ABC*
Trả về
ABC ABC123
Giả sử bạn chạy lệnh trong thư mục chứa các tệp.
echo /path/to/files/ABC* | tr " " "\n"
không phải là một ý tưởng tốt. Xem xét nếu có một tập tin /path/to/files/ABC EFG
, có một khoảng trắng trong tên tệp. Bạn tr
sẽ chia tên tệp thành hai dòng riêng biệt, điều này không tốt. Thậm chí tệ hơn nếu có nhiều khoảng trắng trong tên tệp. Tôi khuyên bạn nên sử dụng printf "%s\n" ABC*
thay vào đó, điều này sẽ giúp ích cho khoảng trắng trong tên tệp, nhưng vẫn có vấn đề với các nhân vật đặc biệt khác như\n
Command-t trong một trong những plugin vim yêu thích của tôi, đó là plugin dựa trên ruby trên mức tích hợp với FZF.
Bằng cách sử dụng Comamnd-T và FZF, bạn có thể thực hiện tìm kiếm với cơ chế "mờ" cực nhanh cho:
Bạn có thể thấy
Tôi luôn tìm kiếm trong lịch sử lệnh bằng cách mở một thiết bị đầu cuối mới và nhấn:
CTRL+R
Ngoài việc tìm kiếm trong tất cả các thư mục đệ quy bằng cách viết vào bất kỳ tab thiết bị đầu cuối nào:
fzf
Sau đó bắt đầu tên tập tin của bạn
ABC
Ngoài ra, bạn có thể viết bên trong vim
:CommandT
Thực sự hữu ích đặc biệt là trong các thư mục lớn.
Giả sử rằng tôi đang ở thư mục gốc và tôi chỉ muốn danh sách thư mục vv: chúng tôi viết,
find -type d -name "etc"
kết quả chúng tôi nhận được,
[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
Một vi dụ khac,
Ngoài ra chúng ta có thể viết:
ls | grep "etc"
chúng tôi nhận được,
etc
ls -l B*
nó hiển thị nội dung của tất cả các thư mục bắt đầu bằngB
thay vì chỉ tên của các thư mục phù hợp?