Câu trả lời hiện có tập trung vào việc giải thích lý do tại sao-e
trường hợp hoạt động-INensensitively trên OSX, và tại sao nó làm như vậy vì lý do tốt nói chung.
Tuy nhiên, đôi khi bạn DO muốn biết liệu một con đường tồn tại ở dạng trường chính xác, bởi vì mặc dù hệ thống tập tin có thể không quan tâm, phần mềm khác thể.
Perl chính nó là một ví dụ:
Ngày OSX, Perl (không may) chấp nhận sự thay đổi trường hợp của một tên mô-đun với tuyên bố use
, vì use
Thực hiện tra cứu hệ thống tập tin, đó là vốn case-insensitive. Tuy nhiên, thực tế sử dụng mô-đun đó sẽ KHÔNG hoạt động, trừ khi tên mô-đun là trường hợp-EXACT; ví dụ: perl -MData::Dumper -E 'print Dumper(666)'
(OK) so với perl -Mdata::dumper -E 'print Dumper(666)'
(ngắt, vì mặc dù tải mô-đun dường như thành công, các thành phần của nó, chẳng hạn như Dumper()
, không thể truy cập được).
Các vấn đề trong Tóm lại: nếu con đường /FOO/BAR
tồn tại trong HFS + của bạn hệ thống tập tin (trên OSX),
-e '/foo/bar'
hoặc bất kỳ biến thể trường hợp đó sẽ chỉ ra rằng con đường tồn tại, và không có cách nào dễ dàng để xác định xem /foo/bar
là một trường hợp đại diện chính xác hoặc, nói chung, trường hợp thực sự của con đường là gì.
Dưới đây là một ngây thơ thực hiện có sử dụng các phương pháp sau đây:
- Đưa lợi thế của thực tế là
File::Glob::bsd_glob()
theo mặc định hoạt động trường nhạy cảm ngay cả trên trên OSX, có hệ thống tập tin (HFS +) là bởi đựng pin- mặc định Vô cảm.
- Tuy nhiên, kết hợp chỉ xảy ra đối với các thành phần đường dẫn chứa mẫu thực tế, trong khi tên là tên được trả về nguyên trạng.
- Do đó, một đường cầu được tạo từ đường dẫn đầu vào biến thành mỗi thành phần đường dẫn thành mẫu tự kết hợp, bằng cách bao quanh char thứ nhất. của mọi thành phần đường dẫn trong [] (một tập hợp chỉ khớp với chính char đó).
sub istruecasepath {
use File::Glob qw/bsd_glob/;
return defined bsd_glob join '', map {
m`^(//?|\.|\.\.|)$` ?
$_
:
'[' . substr($_, 0, 1) . ']' . substr($_, 1)
} split m`(//?)`, shift;
}
này làm việc với các hạn chế sau:
- con đường đầu vào không được chứa các ký tự ASCII
- con đường đầu vào không được chứa metacharacters mẫu (ví dụ, con đường các thành phần không được chứa các ký tự bằng chữ, chẳng hạn như
*
hoặc [
có thể được hiểu sai dưới dạng ký tự mẫu (globbing).
Dưới đây là triển khai mạnh mẽ, bao gồm công việc bổ sung để khắc phục những hạn chế này; đầu vào dự kiến như là một chuỗi Unicode:
sub istruecasepath {
use File::Glob qw/:bsd_glob/;
use Unicode::Normalize;
# Convert to NFD Unicode normal form, because that's how HFS+ stores names.
my $path_nfd_quoted = NFD shift;
# \-quote glob characters and '\' instances.
$path_nfd_quoted =~ s/[][{}*?\\]/\\$&/; #/
my $glob = join '', map {
m`^(//?|\.|\.\.|)$` ?
$_
:
do { my $len = m`^\\` ? 2 : 1; '[' . substr($_, 0, $len) . ']' . substr($_, $len) }
} split m`(//?)`, $path_nfd_quoted;
return defined bsd_glob "$glob", GLOB_QUOTE;
}
Như một phần thưởng, đây là một biến thể mà lợi nhuận con đường trường chính xác như được lưu trữ trong hệ thống tập tin, cho một sự thay đổi trường hợp:
sub getruecasepath {
use File::Glob qw/:bsd_glob/;
use Unicode::Normalize;
# Convert to NFD Unicode normal form, because that's how HFS+ stores names.
my $path_nfd_quoted = NFD shift;
# \-quote glob characters and '\' instances.
$path_nfd_quoted =~ s/[][{}*?\\]/\\$&/; #/
my $glob = join '', map {
m`^(//?|\.|\.\.|)$` ?
$_
:
do { my $len = m`^\\` ? 2 : 1; '[' . substr($_, 0, $len) . ']' . substr($_, $len) }
} split m`(//?)`, $path_nfd_quoted;
my $path_truecase = bsd_glob "$glob", GLOB_NOCASE | GLOB_QUOTE;
return if not defined $path_truecase;
# !! bsd_glob() returns a raw UTF8-encoded byte sequence that isn't
# !! automatically reconverted to a Unicode string, so we must do it
# !! manually here.
utf8::decode($path_truecase);
return $path_truecase;
}
'' $ fileName'' của bạn không nên sử dụng dấu ngoặc kép, và nếu có, nó sẽ sử dụng dấu ngoặc kép (trừ khi bạn ngược lại - như tôi - và trước dấu nháy đơn với 'qq '$ fileName' '). Tương tự như vậy, ký hiệu '
Ngoài ra, tiêu đề của bạn nói 'phân biệt chữ hoa chữ thường' và câu hỏi cho biết 'phân biệt chữ hoa chữ thường'; bạn thật sự muốn gì? –
'-e' chỉ chuyển đối số sang lệnh' stat' của hệ thống. – ikegami