2009-11-06 39 views
66

Tôi biết **/*.ext mở rộng cho tất cả các tệp trong tất cả các thư mục con phù hợp với *.ext, nhưng mở rộng tương tự bao gồm tất cả các tệp như vậy trong thư mục hiện tại là gì?Điều gì mở rộng cho tất cả các tệp trong thư mục hiện tại đệ quy?

+2

tìm kiếm thì sao? – Aif

+4

Bash của tôi không xử lý '**/*. Ext'. Bạn có chắc chắn nó làm việc cho bạn? – tangens

+0

@tangens Bạn đã bật tùy chọn 'globstar' theo câu trả lời của Dennis. – kenorb

Trả lời

82

này sẽ làm việc trong Bash 4:

ls -l {,**/}*.ext 

Để cho glob đúp dấu hoa thị để làm việc, tùy chọn globstar cần phải được đặt (mặc định: trên):

shopt -s globstar 

Từ man bash:

 
    globstar 
        If set, the pattern ** used in a filename expansion con‐ 
        text will match a files and zero or more directories and 
        subdirectories. If the pattern is followed by a /, only 
        directories and subdirectories match. 
+4

Tôi đã thử nghiệm Ubuntu và Cygwin, và 'globstar' được mặc định' off' –

+11

Câu trả lời hay nhất! nhưng tôi nghĩ rằng '**/*. ext' là đủ mặc dù. Ngoài ra, bạn sẽ không có các tệp ẩn trừ khi bạn 'shopt -s dotglob'. –

+0

CentOS 6 Bash 4.1.2 của tôi cũng mặc định tắt cho tùy chọn globstar. – toxalot

3
$ find . -type f 

Điều đó sẽ liệt kê tất cả các tệp trong thư mục hiện tại. Sau đó bạn có thể làm một số lệnh khác trên đầu ra sử dụng exec

$find . -type f -exec grep "foo" {} \; 

Đó sẽ grep mỗi tập tin từ tìm cho chuỗi "foo".

10

Điều này sẽ in tất cả các tệp trong thư mục hiện tại và các thư mục con của nó kết thúc bằng '.ext'.

find . -name '*.ext' -print 
4

Bạn có thể sử dụng: **/*.* để bao gồm tất cả các tệp đệ quy (bật theo: shopt -s globstar).

Vui lòng tìm bên dưới kiểm tra các biến thể khác và cách chúng hoạt động.


Kiểm tra thư mục với 3472 file trong mẫu thư mục VLC kho:

(Tổng số file của 3472 tính theo: find . -type f | wc -l)

  • ls -1 **/*.* - lợi nhuận 3338
  • ls -1 {,**/}*.* - trả lại 3341 (theo đề xuất của Dennis)
  • ls -1 {,**/}* - trả 8265
  • ls -1 **/* - lợi nhuận 7817, ngoại trừ các file ẩn (theo đề nghị của Dennis)
  • ls -1 **/{.[^.],}* - lợi nhuận 7869 (theo đề nghị của Dennis)
  • ls -1 {,**/}.?* - trả 15855
  • ls -1 {,**/}.* - trả về 20321

Vì vậy, tôi nghĩ rằng phương pháp gần nhất để liệt kê tất cả các tệp recursiv ely là ví dụ đầu tiên (**/*.*) theo gniourf-gniourf comment (giả sử các tập tin có phần mở rộng thích hợp, hoặc sử dụng một cụ thể), như ví dụ thứ hai cho vài bản sao giống như dưới đây:

$ diff -u <(ls -1 {,**/}*.*) <(ls -1 **/*.*) 
--- /dev/fd/63 2015-04-19 15:25:07.000000000 +0100 
+++ /dev/fd/62 2015-04-19 15:25:07.000000000 +0100 
@@ -1,6 +1,4 @@ 
COPYING.LIB 
-COPYING.LIB 
-Makefile.am 
Makefile.am 
@@ -45,7 +43,6 @@ 
compat/tdestroy.c 
compat/vasprintf.c 
configure.ac 
-configure.ac 

và người kia tạo ra thậm chí tiếp tục trùng lặp.


Để bao gồm các tệp ẩn, hãy sử dụng: shopt -s dotglob (tắt theo shopt -u dotglob). Nó không được khuyến khích, bởi vì nó có thể ảnh hưởng đến các lệnh như mv hoặc rm và bạn có thể vô tình xóa các tệp sai.

+0

Trên thiết bị đầu cuối Mac và bash với globstar được kích hoạt, tôi tìm thấy giải pháp trên ('' '**/*. *' '') Thông tin và hoạt động tốt nhất. Câu trả lời được chấp nhận gây ra các bản sao của các mục trong thư mục trên cùng. Mẫu làm việc của tôi là: '' '" $ {path} "**/*. *' '' – mummybot

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