2012-07-04 27 views
103

Tôi đã tìm kiếm lệnh sẽ trả về tệp từ thư mục hiện có chứa chuỗi trong tên tệp. Tôi đã thấy các lệnh locatefind có thể tìm thấy tệp bắt đầu bằng một cái gì đó first_word* hoặc kết thúc bằng một cái gì đó *.jpg.Linux - Tìm tệp có chứa chuỗi

Làm cách nào để trả lại danh sách các tệp có chứa chuỗi trong tên tệp? Ví dụ, nếu 2012-06-04-touch-multiple-files-in-linux.markdown là một tệp trong thư mục hiện tại.

Tôi làm cách nào để trả lại tệp này và các tệp khác có chứa chuỗi touch? Sử dụng một lệnh như find '/touch/'

+0

câu hỏi là gây nhầm lẫn. Bạn có muốn tìm các tệp có chứa chuỗi hoặc các tệp có tên * chứa chuỗi đã nói không? câu hỏi đầu tiên được trả lời với 'man grep', câu thứ hai với' man find'. tại sao bạn sẽ google thay vì sử dụng người đàn ông, tôi không biết. –

+1

Cảm ơn! Câu đầu tiên không xác định được nội dung tập tin hay tên tập tin. Đã cập nhật. – Dru

Trả lời

157

Sử dụng find:

find . -maxdepth 1 -name "*string*" -print

Nó sẽ tìm thấy tất cả các file trong thư mục hiện (xóa maxdepth 1 nếu bạn muốn nó đệ quy) có chứa "chuỗi" và sẽ in nó trên màn hình.

Nếu bạn muốn tránh tập tin chứa ':', bạn có thể gõ:

find . -maxdepth 1 -name "*string*" ! -name "*:*" -print

Nếu bạn muốn sử dụng grep (nhưng tôi nghĩ rằng nó không cần thiết như xa như bạn không muốn kiểm tra nội dung tập tin), bạn có thể sử dụng:

ls | grep touch

Nhưng, tôi lặp lại, find là một giải pháp tốt hơn và sạch hơn cho công việc của bạn.

+0

Cảm ơn @Zagorax. Điều này thực hiện chính xác. Muốn lệnh không quá dài nhưng ayee :) – Dru

+1

@Dru, Sửa đổi để bao gồm trường hợp nếu bạn muốn tránh dấu hai chấm. 'find' là một công cụ rất mạnh, nó phải bằng cách nào đó 'dài'. :) – Zagorax

+0

Cảm ơn người đầu tiên đã làm điều đó một cách hoàn hảo mà không cần trả lại bất kỳ nội dung nào. – Dru

12

Sử dụng grep như sau:

grep -R "touch" . 

-R nghĩa recurse. Nếu bạn không muốn đi vào các thư mục con, hãy bỏ qua nó.

-i có nghĩa là "trường hợp bỏ qua". Bạn có thể tìm thấy giá trị này một thử là tốt.

+0

Tuyệt vời. Tôi nhận thấy rằng một số nội dung tập tin theo sau một ':'. Có anyway để giữ lại điều đó? Sử dụng một lựa chọn có lẽ? – Dru

+1

Thử: 'grep -R" chạm vào ". | cut -d ":" -f 2' – carlspring

+0

Điều đó dường như chỉ tạo ra nội dung của các tệp. Về cơ bản, bạn đã trả lời câu hỏi của mình, tôi có thể cố gắng đào bới để giữ lại nội dung. – Dru

0

Nếu chuỗi là lúc bắt đầu của tên, bạn có thể làm điều này

$ compgen -f .bash 
.bashrc 
.bash_profile 
.bash_prompt 
+3

'compgen' không phải là một cái búa thích hợp cho móng tay này.Công cụ ít được sử dụng này được thiết kế để liệt kê * các lệnh có sẵn *, và như vậy, nó liệt kê các tệp trong thư mục * hiện tại * (có thể là các tập lệnh) và nó không thể xem xét lại cũng như không nhìn vào phần đầu của tên tệp hoặc tệp tìm kiếm nội dung, làm cho nó hầu như vô dụng. – msanford

2

Các -maxdepth tùy chọn nên trước khi lựa chọn -name, như dưới đây.,

find . -maxdepth 1 -name "string" -print 
+0

Bạn phải đặt * trước và sau chuỗi "". – Aaron

1
find $HOME -name "hello.c" -print 

Thao tác này sẽ tìm kiếm toàn bộ hệ thống $HOME (tức là /home/username/) cho bất kỳ tệp nào có tên “hello.c” và hiển thị tên đường dẫn của chúng:

/Users/user/Downloads/hello.c 
/Users/user/hello.c 

Tuy nhiên, nó sẽ không khớp với HELLO.C hoặc HellO.C.Để phù hợp là trường hợp nhạy cảm vượt qua các tùy chọn -iname như sau:

find $HOME -iname "hello.c" -print 

Mẫu đầu ra:

/Users/user/Downloads/hello.c 
/Users/user/Downloads/Y/Hello.C 
/Users/user/Downloads/Z/HELLO.c 
/Users/user/hello.c 

Vượt qua tùy chọn -type f để chỉ tìm kiếm cho các tập tin:

find /dir/to/search -type f -iname "fooBar.conf.sample" -print 
find $HOME -type f -iname "fooBar.conf.sample" -print 

Các -iname công trình hoặc trên GNU hoặc BSD (bao gồm cả OS X) phiên bản tìm lệnh. Nếu phiên bản của lệnh find không hỗ trợ -iname, hãy thử các cú pháp sau sử dụng grep lệnh:

find $HOME | grep -i "hello.c" 
find $HOME -name "*" -print | grep -i "hello.c" 

HOẶC thử

find $HOME -name '[hH][eE][lL][lL][oO].[cC]' -print 

kết quả đầu ra mẫu:

/Users/user/Downloads/Z/HELLO.C 
/Users/user/Downloads/Z/HEllO.c 
/Users/user/Downloads/hello.c 
/Users/user/hello.c 
0
grep -R "somestring" | cut -d ":" -f 1 
+0

Điều này dường như là câu trả lời cho một câu hỏi khác - nhưng bởi vì bạn đã không cung cấp giải thích, điều đó không rõ ràng đối với người hỏi hoặc cho bất kỳ ai khác. –

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