Làm cách nào để tìm kiếm tất cả các tập tin bắt đầu với tên "ABC ABC" trong một thư mục?


58

Tôi cần tìm kiếm các tập tin bắt đầu với một số tên cụ thể. Có thể có nhiều tệp bắt đầu bằng một mẫu cụ thể và tôi muốn liệt kê tất cả các tệp như vậy có trong thư mục.

Câu trả lời:


60

Để 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 lscó 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, treechính nó hỗ trợ ký tự đại diện.


2
Tại sao khi tôi làm ls -l B*nó hiển thị nội dung của tất cả các thư mục bắt đầu bằng Bthay vì chỉ tên của các thư mục phù hợp?
ErikE

@ErikE Bởi vì khi bạn yêu cầu lsliệ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*.
Azor Ahai

@AzorAhai Nhưng tại sao nó lại coi B*là một đặc tả thư mục?
ErikE

@ErikE Bởi vì việc sử dụng tệp toàn cầu 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 lsmột danh sách các thư mục, vì vậy nó sẽ mở tất cả chúng cho bạn.
Azor Ahai

1
Không trả lời câu hỏi. 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.
greatvovan

42

Bạn có thể sử dụng findlệ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 findlệnh để tìm kiếm tên tệp bằng cách sử dụng một mẫu


7

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ế ABCbằng văn bản của bạn.

Để hiểu lệnh, hãy phá vỡ nó một chút:

  • findliệ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 ./ABCvà 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.

  • greplấy đầu ra và lọc nó bằng cách sử dụng mẫu đã cho , ^\./ABC.

    • Lưu ý rằng mẫu được trích dẫn với các dấu ngoặc đơn ' 'để 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 đó grepkhô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.)


1
Tại sao bạn sẽ find | grepkhi findcó 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?
Darael

3

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

2

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).

nhập mô tả hình ảnh ở đây

Sau đó, chỉ cần gõ biểu thức chính quy ABC* và xác nhận.

nhập mô tả hình ảnh ở đây

Mỗi tệp có tên phù hợp với mẫu của bạn sẽ được chọn tự động.

nhập mô tả hình ảnh ở đây

Tôi đang sử dụng Nautilus 3.6. * Từ GNOME3 PPA trên Ubuntu 12.10 (Định lượng).


1

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"

1

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, locatelệ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ú:

  • Lệnh trên mất 1 giây để chạy trên 1 triệu tệp.
  • So sánh findlệ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.
  • Nếu các tập tin đã được tạo ngày hôm nay, bạn phải chạy sudo updatedbđầu tiên.

0

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.


0

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  },".")' 

0
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.


Các 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 trsẽ 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
Sergiy Kolodyazhnyy

0

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:

  • Mở tệp và bộ đệm
  • Nhảy vào thẻ và giúp đỡ
  • Chạy các lệnh, hoặc các tìm kiếm và lệnh trước đó
  • với số lượng tổ hợp phím tối thiểu.

Bạn có thể thấy

nhập mô tả hình ảnh ở đâ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.


0

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.