Trong Bash, việc mở rộng ký tự đại diện có được đảm bảo theo thứ tự không?


53

Việc mở rộng một ký tự đại diện trong Bash có được đảm bảo theo thứ tự bảng chữ cái không? Tôi buộc phải chia một tệp lớn thành 10 Mb để chúng có thể được kho lưu trữ Mercurial của tôi chấp nhận.

Vì vậy, tôi đã nghĩ rằng tôi có thể sử dụng:

split -b 10485760 Big.file BigFilePiece.

và sau đó thay cho:

cat BigFile | bigFileProcessor

Tôi có thể làm:

cat BigFilePiece.* | bigFileProcessor

ở vị trí của nó.

Tuy nhiên, tôi không thể tìm thấy bất cứ nơi nào đảm bảo rằng việc mở rộng dấu hoa thị (hay còn gọi là ký tự đại diện, aka *) sẽ luôn theo thứ tự bảng chữ cái để .aađi trước .ab(trái ngược với thứ tự dấu thời gian hoặc đại loại như thế).

Ngoài ra, có bất kỳ sai sót trong kế hoạch của tôi? Làm thế nào tuyệt vời là chi phí hiệu suất của cating các tập tin với nhau?


4
Để chắc chắn rằng bạn đang thực hiện sai phương pháp. Nếu quản trị viên đặt giới hạn cho kích thước tệp bạn có trong kho lưu trữ, thì bạn nên nói chuyện với anh ta. Nói về việc mở rộng - Tôi luôn thấy rằng việc mở rộng là chữ và số.
Mircea Vutcovici

1
Bạn luôn có thể chuyển qua sortnếu bạn cần bất kỳ thao tác đặt hàng bổ sung.
Warner

2
Xin lưu ý rằng Mercurial có thể quản lý các tệp có kích thước bất kỳ, giới hạn bởi dung lượng RAM bạn có. Bạn nhận được cảnh báo nếu bạn thêm một tệp lớn, vì Mercurial giả định rằng nó có thể giữ tệp trong bộ nhớ. Để hợp nhất, Mercurial cần giữ hai tệp trong bộ nhớ. Do đó, máy có dung lượng RAM nhỏ có thể gặp sự cố khi kiểm tra tệp. Tôi vừa thử nó, và hg committrên một Ntệp MB yêu cầu khoảng 3 * NMB RAM và hg updateyêu cầu khoảng 2 * NMB RAM. Đây là với Mercurial 1.5 trên Linux.
Martin Geisler

Câu trả lời:


67

Có, mở rộng toàn cầu là bảng chữ cái.

Từ mantrang Bash :

Mở rộng tên đường dẫn

Sau khi chia tách từ, trừ khi các -ftùy chọn đã được thiết lập, bash quét mỗi từ cho các nhân vật *, ?[. Nếu một trong những ký tự này xuất hiện, thì từ đó được coi là một mẫu và được thay thế bằng một danh sách tên tệp được sắp xếp theo thứ tự bảng chữ cái phù hợp với mẫu.


@Dennis Williamson, Bạn có biết điều này có còn đúng không nếu người dùng có bộ ngôn ngữ khác?
Zoredache

5
@Zoredache: Nó thực sự được chỉ định bởi POSIX: opengroup.org/onlinepub/007908775/xsh/glob.html "Các tên đường dẫn được sắp xếp theo thứ tự như được xác định bởi cài đặt hiện tại của danh mục LC_COLLATE, xem thông số XBD, LC_COLLATE [ opengroup.org / onlinepub / 007908775 / xbd / Lỗi "và đó là lý do tại sao bạn nên làm những việc như thế ls -l [[:lower:]]thay vì ls -l [a-z].
Dennis Williamson

Lưu ý rằng thứ tự được sắp xếp theo thứ tự abc nên BigFilePiece.10 sẽ đến trước BigFilePiece.2
Ken

@DennisWilliamson - Tại sao hai cặp dấu ngoặc vuông? Một người dường như làm việc giống hệt tôi.
ArtOfWarfare

2
@ArtOfWarfare: Hãy thử điều này : mkdir lctest; cd lctest; touch w; touch z; ls -l [:lower:]; echo =====; ls -l [[:lower:]]. Tệp "z" chỉ được liệt kê bởi thứ hai lsvì nó yêu cầu tên tệp chữ thường viết thường. Đầu tiên ls- cái không có dấu ngoặc vuông bên ngoài - đang yêu cầu tên tệp một ký tự từ danh sách các ký tự ":", "l", "o", "w", "e" và "r". Trong cả hai trường hợp, dấu ngoặc vuông ngoài cùng sẽ phân định biểu thức ngoặc liệt kê các ký tự và lớp. Trong trường hợp [[:lower:]], dấu ngoặc vuông bên trong, dấu hai chấm và tên từ một lớp ký tự. ...
Dennis Williamson

4

Đó là hành vi được ghi lại bashđể bạn có thể phụ thuộc vào nó trong các tập lệnh của mình. Nó cũng đúng với các shell tương thích Bourne khác trong một thời gian rất dài ... mặc dù có thể có các trường hợp góc liên quan đến trường hợp gấp hoặc không ký tự chữ và số.

(Danh sách kết quả, trong bashsẽ được ở gần "ASCII-betical" trật tự --- ngoại trừ việc thấp hơn và trên chữ trường hợp sẽ được đối chiếu với nhau như nếu có không phân biệt hoa thường, nhưng với trường hợp thấp hơn đối chiếu trước trên trường hợp tương đương của họ. Tất cả không -alph.usics nên đối chiếu theo cùng một thứ tự như chúng xuất hiện trong ASCII).

Như những người khác đã chỉ ra điều này có thể bị nhiễu loạn bởi các cài đặt môi trường liên quan đến ngôn ngữ của bạn: LANG nói chung và LC_COLLATE cụ thể hơn. Trong có thể an toàn nhất để chạy các lệnh phụ thuộc vào thứ tự mở rộng toàn cầu theo envlệnh để xóa môi trường (sử dụng -ihoặc -ukhi thích hợp) hoặc chuyển các kết quả qua sortđể đảm bảo trình tự mạnh mẽ.


4
Dường như tất cả các chữ số không được bỏ qua trong quá trình sắp xếp. Vì vậy, "=", "_", "~" không thể được sử dụng để buộc một tệp bắt đầu hoặc kết thúc (tương ứng) danh sách.
Otheus

3

Trong khi mở rộng toàn cầu được sắp xếp theo thứ tự abc, chúng cũng tuân theo cài đặt langage của shell.

Đảm bảo đặt giá trị này thành "C" trong tập lệnh của bạn nếu bạn dự định đây là bản di động.

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.