2013-09-25 138 views
6

Tôi có một dự án trên hộp Linux chứa tệp có các ký tự bị coi là bất hợp pháp/được bảo lưu trong Windows (http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx). Dự án có hơn 10.000 tệp trên nhiều thư mục và tôi sẽ xác định đường dẫn cho các tệp này.Tìm các tệp có các ký tự cửa sổ bất hợp pháp trong tên trên Linux

tôi có thể find . -name "*\?*" cho mỗi/ký tự dành riêng bất hợp pháp, nhưng có một cách dễ dàng hơn để tìm tất cả các file có chứa < > : "/\ | ? *

Một khi tôi đã xác định, tôi muốn để loại bỏ tất cả các ký tự như vậy từ mỗi những tệp này.

Trả lời

9

này tìm thấy một-liner nên làm việc cho bạn:

find . -name "*[<>:\\|?*]*" -exec bash -c 'x="{}"; y="$(sed "s/[<>:\\|?*]\+/-/g" <<< "$x")" && mv "$x" "$y" ' \; 
+0

Cảm ơn bạn rất nhiều! –

+0

anubhava, có cách nào tôi có thể áp dụng mv vào các thư mục không? –

+0

Lệnh trên sẽ thực hiện việc này cho các tệp và thư mục mà tôi tin. – anubhava

9

fnmatch mô hình cho phép bạn xác định rằng các nhân vật trong [] như sau:

find . -name '*[<>:/\\|?*]*' 
+0

Cảm ơn! Tôi có thể chuỗi lệnh xargs để đổi tên các tệp này, xóa các ký tự đó và thay thế chúng bằng, cho phép nói a - (dấu gạch ngang)? –

+1

Tôi đã phải thay đổi dấu ngoặc kép thành đơn để tìm dấu gạch chéo ngược – wjandrea

+0

@wjandrea, Cảm ơn bạn đã phản hồi. Tôi đã cập nhật mã cho phù hợp. – falsetru

0

Cả các câu trả lời ở trên thấy các tập tin hoặc thư mục đã kết thúc trong cả dấu cách ('') hoặc dấu chấm/dấu chấm ('.') cũng không hiển thị với API Win32.

Thêm vào câu trả lời .e.g @ falsetru, người ta có thể làm

find . -name '*[<>:/\\|?*]*' -o -name '*[ \.]'