Tận dụng lợi thế của việc mở rộng niềng răng:
du -b maybehere*/{*,.[^.],.??*}
Hay cách khác
du -b maybehere*/{,.[^.],..?}*
Logic đằng sau điều này có lẽ không rõ ràng, vì vậy đây là lời giải thích:
*
phù hợp với tất cả các tệp không bị ẩn
.[^.]
khớp với các tệp có tên bắt đầu bằng dấu chấm đơn theo sau không phải là dấu chấm; đó chỉ là tên tập tin 2 ký tự ở dạng đầu tiên.
.??*
phù hợp với các tệp ẩn dài ít nhất 3 ký tự
..?*
như trên, nhưng ký tự thứ hai phải là một dấu chấm
Toàn bộ vấn đề là loại trừ các liên kết cứng đến thư mục hiện tại và thư mục mẹ ( .
và ..
), nhưng bao gồm tất cả các tệp bình thường theo cách mà mỗi tệp sẽ chỉ được tính một lần!
Ví dụ, đơn giản nhất là chỉ viết
du -b maybehere*/{.,}*
Điều đó có nghĩa là danh sách chứa một dấu chấm .
và "không có gì" (không có gì ở giữa ,
và đóng }
), do đó tất cả các tệp bị ẩn (bắt đầu từ một dấu chấm) và tất cả các tệp không bị ẩn (bắt đầu từ "nothing") sẽ khớp. Vấn đề là điều này cũng sẽ phù hợp .
và ..
, và đây có lẽ không phải là điều bạn muốn, vì vậy chúng tôi phải loại trừ nó bằng cách nào đó.
Lời cuối cùng về mở rộng cú đúp.
Mở rộng dấu ngoặc là một cơ chế theo đó bạn có thể bao gồm nhiều tệp / chuỗi / bất cứ thứ gì vào dòng lệnh bằng cách viết ít ký tự hơn. Cú pháp là {word1,word2,...}
, tức là nó là một danh sách các chuỗi được phân tách bằng dấu phẩy bắt đầu từ {
và kết thúc bằng }
. bash
hướng dẫn đưa ra một ví dụ rất cơ bản và đồng thời rất phổ biến về cách sử dụng:
$ echo a{b,c,d}e
abe ace ade
maybehere*/.*
và nối ở trên cho tất cả