Làm thế nào để khớp * với các tập tin ẩn trong một thư mục


21

Làm thế nào để khớp các tập tin ẩn bên trong các thư mục đã cho

ví dụ

Nếu tôi đưa ra lệnh dưới đây thì nó không cho kết quả của các tệp bị ẩn,

 du -b maybehere*/*

Làm thế nào để đạt được điều này đơn giản bằng cách sử dụng một lệnh thay vì sử dụng

du -b maybehere*/.* maybehere*/*

như tôi cần gõ có lẽ hai lần.


Cố gắng chỉ ẩn maybehere*/.*và nối ở trên cho tất cả
Costas

1
Chỉnh sửa của bạn tạo một câu hỏi mới với các hạn chế bổ sung, làm cho Q trở thành mục tiêu di động, có thể làm mất hiệu lực (các) câu trả lời đã được đưa ra. Đó là cách cư xử tệ, chỉ cần hỏi một câu hỏi mới nếu bạn có.
Anthon

Câu trả lời:


22

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ẹ ( ...), 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à đâ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 }. bashhướ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

Việc sử dụng của { }tôi không có ý tưởng gì :( bạn có thể cho tôi một hướng để có thêm thông tin về nó không
vidhan

@vidhan xem bản chỉnh sửa và xem man bashchương "Mở rộng Brace".
jimmij

bạn có phiền cho tôi giải thích thêm cho những điều trên một chút giải thích rõ ràng hơn về cách mọi thứ hoạt động như tôi mới với những điều này @jimmij
vidhan 22/215

6
.??*không khớp .a, .b... .[^.]*không khớp ..foo.
Stéphane Chazelas

4
.foophù hợp với cả .[^.]*.??*. Bạn muốn {.[!.],..?,}*.
Stéphane Chazelas

14

Vì bạn đã sử dụng cú pháp cụ thể của GNU ( -b):

du -abd1 maybehere*/

Theo cách đó, nó duliệt kê các tệp trong maybehere*thư mục (và nó không loại trừ các tệp chấm). -d1giới hạn việc báo cáo sử dụng đĩa xuống một mức (bao gồm cả các thư mục không có -a).

Mặt khác, để các khối được bao gồm các tệp ẩn (ngoại trừ ...), mỗi shell có cú pháp riêng:

  • zsh:

    du -b maybehere*/*(D)
  • ksh93:

    (FIGNORE='@(.|..)'; du -b maybehere*/*)
  • bash:

    (shopt -s dotglob; du -b maybehere*/*)
  • tcsh:

    (set globdot; du -b maybehere*/*)
  • yash:

    (set -o dot-glob; du -b maybehere*/*)

    mặc dù hãy cẩn thận, nó bao gồm ...trên các hệ thống bao gồm chúng trong kết quả readdir() khiến nó khó sử dụng được.


8

Một tùy chọn khác có sẵn ở đây :

du -sm .[!.]* *

Tại sao bạn muốn bỏ qua tên tập tin bắt đầu bằng ..?
Kusalananda

2
Có lẽ, vì họ không muốn liệt kê mọi thứ trong ../và dưới đây.
Shadur

Điều này không tính các tập tin như ví dụ ..myfile; thêm ..?*vào đó Nhưng +1 để sử dụng cú pháp toàn cầu phù hợp cho kết quả phủ định.
Pedro Gimeno

0

Nếu bạn muốn chỉ liệt kê các thư mục ẩn hoặc hoạt động trên các thư mục ẩn thì như Costas nói bạn có thể sử dụng

du -b maybehere*/.*

Điều này sẽ cho phép bạn hoạt động trên các tập tin và thư mục ẩn. Nếu bạn chỉ muốn các thư mục ẩn thì bạn có thể chỉ định điều đó với

du -b maybehere*/.*/


bạn có thể vui lòng xem lại câu hỏi một lần nữa @SailorCire Tôi đã chỉnh sửa nó một chút
vidhan

@vidhan vì vậy bạn chỉ muốn làm việc ẩn trong một thư mục? Đúng không?
Thủy thủ

không tôi muốn khớp cả hai tệp bị ẩn và không bị ẩn trong một thư mục thay vì sử dụng cả du maybehere*/.*maybehere*/*một của ẩn và một
tệp

@vidhan du -bchọn cả ẩn và không ẩn.
Thủy thủ

không :( thật không may @SailorCire
vidhan

0

Mặc dù không trực tiếp shell, bạn có thể sử dụng find với độ sâu giới hạn như thế này

find maybehere -maxdepth 1 -exec du -sh {} \;
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.