Cách tìm kiếm tệp đệ quy vào thư mục con


117

Tôi đang cố gắng tìm kiếm tất cả XMLcác tệp trong một thư mục cụ thể và tất cả các thư mục con (đệ quy) bên trong nó.

ls -R *.xmlchỉ liệt kê các tập tin trong thư mục hiện tại. Tôi khá chắc chắn, bản thân các thư mục con có một vài .xmltệp, nhưng không có tệp nào hiển thị.

Đây có phải là một vấn đề cấu hình?


2
Bạn có thể làmls -R | grep .xml
Nikos

Câu trả lời:


90

Hãy thử sử dụng Tìm

sudo find . -print | grep -i '.*[.]xml'

4
sudo phải, hoặc nó ở đó để đảm bảo đặc quyền siêu người dùng?
Shamim Hafiz

4
Tôi để bạn quyết định. Sudo , Không Sudo .
Mitch

6
Chỉ cần quan tâm. Lợi thế của findhơn là ls -Rgì?
don.joey

1
@ don.joey Điều này có thể giúp stackoverflow.com/questions/13830036/ cấp
Mitch

10
-1 để trộn findgrepkhi findcó thể thực hiện lọc bằng cả regex và globs, và không sử dụng find's -print0và grep' -zkhi bạn cần trộn.
muru

147

Bạn chỉ có thể làm điều đó với find :

find . -name '*.xml'

.là thư mục hiện tại. Nếu bạn cần tìm kiếm trong một thư mục khác, thay thế .bằng đường dẫn thư mục.


2
Nó có tìm kiếm tệp yêu cầu đệ quy trong thư mục bắt nguồn từ thư mục hiện tại không. Trong trường hợp của tôi, nó chỉ kiểm tra trong thư mục hiện tại, không kiểm tra thư mục con.
Mostafiz Rahman

1
@ mostafiz, bạn cần trích dẫn phần '* .xml'. Tôi sẽ chỉnh sửa câu trả lời của tôi.
KaeruCT

1
Trên thực tế tôi đã tìm kiếm .phpcác tập tin trong thư mục hiện tại. Nhưng nó chỉ trả về .phpcác tệp trong thư mục hiện tại, không được tìm kiếm đệ quy trong các thư mục con. Đó là lý do tại sao tôi hỏi liệu findlệnh tìm kiếm đệ quy hay không.
Mostafiz Rahman

3
@ mostafiz, findlệnh tìm kiếm đệ quy. Nếu bạn không trích dẫn tham số, tôi nghĩ shell của bạn có thể thực hiện mở rộng trên *, vì vậy nó sẽ khớp với các tệp trong thư mục hiện tại.
KaeruCT

Được rồi! Có thể tôi đã phạm một số sai lầm. Bây giờ nó đang hoạt động hoàn hảo!
Mostafiz Rahman

13

Hãy thử lệnh này:

ls -R | grep '.*[.]xml'

lskhông có tùy chọn để lọc đầu ra. Cho rằng bạn sẽ cần phải sử dụng đường ống. Điều này chuyển đầu ra từ lsđến grep, sau đó lọc chúng để chỉ hiển thị các .xmltệp.


5
Dù sao để có được điều này để hiển thị các thư mục nó đến từ?
AdamO


4

bash

Sử dụng globstartùy chọn shell, chúng ta có thể sử dụng tính năng đệ quy./**/*

bash-4.3$ shopt -s globstar
bash-4.3$ for i in  ./**/*.xml; do printf "%s\n" "$i" ; done
./adwaita-timed.xml
./bin/hw5/stuff/book/chapter42servletexample/build/web/META-INF/context.xml
./bin/hw5/stuff/book/chapter42servletexample/build/web/WEB-INF/beans.xml
./bin/hw5/stuff/book/chapter42servletexample/build/web/WEB-INF/web.xml

Perl

Perl có một mô-đun Find, cho phép duyệt qua thư mục cây đệ quy. Trong find()hàm đặc biệt , chúng ta có thể định nghĩa một chương trình con mong muốn và thư mục mà chúng ta muốn duyệt qua, trong ví dụ này là .. Một lớp lót trong trường hợp như vậy sẽ là:

bash-4.3$ perl -le 'use File::Find; find(sub{-f && $_ =~ /.xml$/ && print $File::Find::name},".")' 
./adwaita-timed.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/beans.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/web.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/liangweb/build.xml

Con trăn

Trong khi Perl có toàn bộ mô-đun dành riêng cho duyệt qua cây đệ quy, Python có một chức năng gọn gàng walk()là một phần của osmô-đun và liên tục trả về tuple của đường dẫn trên cùng, danh sách tất cả các thư mục con và danh sách tên tệp. Chúng tôi có thể làm như sau:

bash-4.3$ python -c 'import os,sys; [ sys.stdout.write(os.path.join(r,i)+"\n") for r,s,f in os.walk(".") for i in f if i.endswith(".xml") ]' 
./adwaita-timed.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/beans.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/web.xml
./CLEAR_DESKTOP/blahblah/hw5/stuff/book/liangweb/build.xml

Điều này có thể gọn gàng hơn như một kịch bản:

#!/usr/bin/env python
import os,sys 
for r,s,f in os.walk("."): 
    for i in f: 
        if i.endswith(".xml") 
             print(os.path.join(r,i))

tìm thấy

Các câu trả lời khác đã được đề cập findcho giao dịch đệ quy và đó là công cụ tiếp theo cho công việc. Điều cần đề cập là thực tế findcó nhiều công tắc dòng lệnh, chẳng hạn như -printfin đầu ra ở định dạng mong muốn, -type fchỉ tìm các tệp thông thường, -inumtìm kiếm theo số inode, -mtimetìm kiếm theo ngày sửa đổi, -exec <command> {} \;để thực thi một lệnh cụ thể để xử lý tệp với việc truyền tệp dưới dạng đối số (nơi giữ chỗ {}chuẩn findcho tệp hiện tại) và nhiều tệp khác vì vậy vui lòng đọc trang hướng dẫn find.

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.