Làm thế nào để tìm tên tệp / thư mục giống nhau, nhưng với cách viết hoa / trường hợp khác nhau?


7

Làm thế nào tôi có thể liệt kê các tên tệp / thư mục trong một thư mục đệ quy giống nhau, nhưng với cách viết hoa / trường hợp khác nhau? Ví dụ.:

INPUT (không phải lslệnh, các thư mục):

[user@localhost ~/a] ls -R
.:
b

./b:
ize  Ize

./b/ize:

./b/Ize:
[user@localhost ~/a] 

ĐẦU RA:

/b/ize

Tôi đoán bạn có nghĩa là "trường hợp khác nhau" (không phải "kích thước phông chữ khác nhau")?
phunehehe

Duh, viết hoa, tôi không thể hiểu anh ấy đang hỏi gì.
slm

@ gasko-peter bạn đang tìm kiếm các tệp có tên tương tự vì bạn đang cố gắng xác định cùng một tệp với một tên khác?
Evan Carroll

Câu trả lời:


7

Nếu bạn có GNU uniq, bạn có thể sắp xếp trường hợp không nhạy ( -i) và chỉ sử dụng -dđể in các dòng trùng lặp:

find . | sort -f | uniq -di

Như @StephaneChazelas đã đề cập trong câu trả lời của anh ấy , điều này có thể không làm những gì bạn mong đợi nếu bạn có thể có các đường dẫn trùng lặp chỉ khác nhau trong trường hợp (như a/b/fooA/b/foo).


Bạn có thể muốn sort -fở đây. Cũng lưu ý rằng GNU uniqcó giới hạn giống như GNU trvì nó không hoạt động đối với trường hợp khớp các ký tự nhiều byte.
Stéphane Chazelas

@StephaneChazelas tại sao tôi muốn sort -f? Nếu uniqcó thể giải quyết vụ án, tại sao tôi cũng cần phải làm cho sorttrường hợp không nhạy cảm? Và ý nghĩa của các ký tự nhiều byte là gì? Những thứ như \n, \rvv? Làm thế nào họ có thể có trường hợp khác nhau?
terdon

1
Hãy thử export LC_ALL=C; printf '%s\n' a A b B | sort | uniq -di. Một số địa phương sắp xếp trường hợp không nhạy cảm, một số khác (như C) thì không. uniqcần một đầu vào được sắp xếp, các dòng trùng lặp của nó phải liền kề.
Stéphane Chazelas

2

Giả sử tên tệp không chứa ký tự dòng mới, bạn có thể làm một số thứ như:

find . | tr '[:upper:]' '[:lower:]' | sort | uniq -d

Lưu ý rằng một số trtriển khai như GNU trkhông thay đổi trường hợp các ký tự nhiều byte.

Cũng lưu ý rằng đường dẫn mà nó báo cáo có thể không phải là đường dẫn của bất kỳ tệp nào. Ví dụ, nếu có một ./a/b/fOovà một ./A/b/fOotệp, nó sẽ báo cáo ./a/b/foo. Nếu đó không phải là điều bạn muốn, bạn có thể muốn tinh chỉnh các yêu cầu của mình.


-1

Tất cả những ý tưởng này là xấu. Sử dụng tổng kiểm tra và chắc chắn các tập tin là như nhau. Sau đó, nhiệm vụ trở nên dễ dàng.

find . -type f -exec md5sum {} + |
sort |
perl -a -nE'push(@{$db{$F[0]}},$F[1]);END{for(keys%db){say"Dupe detected @{@db{$_}}"if scalar@{$db{$_}}>1}}'

Điều này sẽ sha1sum mỗi tệp trong thư mục và tất cả các thư mục con và xuất tất cả các bản sao của tệp đó, nếu có. Tôi đã thực hiện multiline đường ống cho dễ đọc.


OP không tìm kiếm các tệp giống hệt nhau, anh ấy đang tìm các tệp có cùng tên, nội dung có thể khác nhau. Xin lỗi, nhưng đó là ý tưởng đó là xấu :).
terdon

Ví dụ đầu tiên của anh cho biết kích thước phông chữ khác nhau , đủ để cho rằng anh không có ý tưởng về những gì anh muốn.
Evan Carroll

1
Đủ để nói rằng tiếng Anh không phải là ngôn ngữ mẹ đẻ của anh ấy, hầu như không phải lỗi của OP. Tuy nhiên, ví dụ cho thấy rõ ràng rằng anh ta không so sánh các tệp, chỉ tìm kiếm các tệp cùng tên theo cách không phân biệt chữ hoa chữ thường. Tất cả những gì tôi nói là bạn có thể muốn đọc một câu hỏi kỹ hơn trước khi quyết định ý tưởng nào là "xấu".
terdon

Đã đồng ý. Điều này không giải quyết mối quan tâm của OP. Tôi cũng thấy lạ khi bạn dán nhãn một câu trả lời được OP chấp nhận là một ý tưởng tồi bởi vì đó không phải là điều OP muốn!
Joseph R.
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.