2012-11-11 29 views
12

Tôi hiện đang cố gắng tạo một tập lệnh có thể nhập vào để xem có gì đó thuộc loại tệp nhất định (ví dụ zip) hay không, mặc dù văn bản trước loại tệp có thể là bất kỳ thứ gì, ví dụ:Làm thế nào để grep cho một phần mở rộng tập tin

something.zip 
this.zip 
that.zip 

tất cả đều thuộc danh mục. Tôi cố gắng để grep cho những sử dụng một ký tự đại diện, và cho đến nay tôi đã cố gắng này

grep ".*.zip" 

Nhưng bất cứ khi nào tôi làm điều đó, nó sẽ tìm ra .zip file tốt, nhưng nó vẫn sẽ hiển thị đầu ra nếu có thêm các ký tự sau .zip, ví dụ: .zippppppp hoặc .zipdsjdskjc vẫn sẽ được grep nhặt. Có nói rằng, tôi nên làm gì để ngăn chặn grep hiển thị các trận đấu có các ký tự bổ sung sau .zip?

Trả lời

32

Kiểm tra cuối dòng bằng $ và thoát khỏi số thứ hai . bằng dấu gạch chéo ngược để nó chỉ khớp với dấu chấm và không phải ký tự nào.

grep ".*\.zip$" 

Tuy nhiên ls *.zip là một cách tự nhiên hơn để làm điều này nếu bạn muốn liệt kê tất cả các .zip tập tin trong thư mục hiện hành hoặc find . -name "*.zip" cho tất cả .zip tập tin trong thư mục con bắt đầu từ (và bao gồm) sự thư mục hiện tại.

+2

hoạt động hoàn hảo, cảm ơn! – lacrosse1991

+0

Làm thế nào về 'grep '\ .zip" ' – Steve

0

Đơn giản chỉ cần làm:

grep ".*.zip$" 

Các "$" cho biết kết thúc của dòng

+1

Lưu ý, điều này sẽ bao gồm các tệp như' hello.unzip' hoặc 'hi.xzip' hoặc thậm chí là' hellozip'. Bạn nên thoát khỏi cái thứ hai "." – twasbrillig

4

Bạn cần phải làm một vài điều. Nó sẽ giống như sau:

grep '.*\.zip$' 

Bạn cần thoát khỏi dấu chấm thứ hai, vì vậy nó sẽ chỉ khớp với dấu chấm và không phải ký tự nào. Sử dụng dấu nháy đơn giúp việc thoát dễ dàng hơn một chút.

Bạn cần ký hiệu đô la ở cuối dòng để cho biết rằng bạn muốn "zip" xuất hiện ở cuối dòng.

12

Trên UNIX, hãy thử:

find . -name \*.zip -print 
+0

Siêu nhanh - cảm ơn bạn – Mick

2

Hãy thử: grep -o -E "(\\.([A-z])+)+"

Tôi sử dụng này để có được đa rải rác/nhiều phần mở rộng. Vì vậy, nếu đầu vào là hello.tar.gz, thì nó sẽ xuất ra .tar.gz. Đối với một chấm, sử dụng grep -o -E "\\.([A-z])+$". Thử nghiệm trên Cygwin/MingW + MSYS.

1

Thêm một sửa chữa/addon của ví dụ trên:

# multi-dotted/multiple extensions 
grep -oEi "(\\.([A-z0-9])+)+" file.txt 

# single dotted 
grep -oEi "\\.([A-z0-9])+$" file.txt 

này sẽ nhận được phần mở rộng tập tin như' .mp3' và vv

0

Chỉ cần xem xét một số các câu trả lời khác. .* là không cần thiết, và nếu bạn đang tìm kiếm một phần mở rộng tập tin nhất định, tốt nhất là bao gồm -i để nó không phân biệt chữ hoa chữ thường; trong trường hợp tệp tin là HELLO.ZIP, chẳng hạn. Tôi không nghĩ rằng dấu ngoặc kép là cần thiết.

grep -i \.zip$ 
1

Tôi sử dụng tính năng này để lấy danh sách các loại tệp trong thư mục.

find . -type f | egrep -i -E -o "\.{1}\w*$" | sort -su 

Đầu ra ví dụ:

.DS_Store 
.MP3 
.aif 
.aiff 
.asd 
.doc 
.flac 
.jpg 
.m4a 
.m4p 
.m4r 
.mp3 
.pdf 
.png 
.txt 
.wav 
.wma 
.zip 

BONUS: với

find . -type f | egrep -i -E -o "\.{1}\w*$" | sort | uniq -c 

Bạn sẽ lấy số liệu file:

106 .DS_Store 
    35 .MP3 
    89 .aif 
     5 .aiff 
    525 .asd 
     1 .doc 
    60 .flac 
    48 .jpg 
    149 .m4a 
    11 .m4p 
     1 .m4r 
    12844 .mp3 
     1 .pdf 
     5 .png 
     9 .txt 
    108 .wav 
    44 .wma 
     2 .zip 
1

Bạn cũng có thể sử dụng grep để tìm tất cả các tệp có phần mở rộng cụ thể:

find .|grep -e "\.gz$" 

. là thư mục hiện tại. Nếu bạn muốn chỉ định thư mục khác với thư mục hiện tại, chỉ cần thay thế . bằng đường dẫn thư mục. Dưới đây là một ví dụ: Cho phép tìm tất cả các file kết thúc bằng .gz và nằm trong thư mục/var/log

find /var/log/ |grep -e "\.gz$" 

Đầu ra là một cái gì đó tương tự như sau:

✘ ⚙> find /var/log/ |grep -e "\.gz$" 

/var/log//mail.log.1.gz 
/var/log//mail.log.0.gz 
/var/log//system.log.3.gz 
/var/log//system.log.7.gz 
/var/log//system.log.6.gz 
/var/log//system.log.2.gz 
/var/log//system.log.5.gz 
/var/log//system.log.1.gz 
/var/log//system.log.0.gz 
/var/log//system.log.4.gz 

Dấu hiệu $ cơ bản thống kê rằng tiện ích mở rộng tệp kết thúc bằng gz

Các vấn đề liên quan