2013-06-03 36 views
5

Tôi muốn bỏ qua tất cả các tệp ẩn, nhưng đặc biệt là tệp .git và .svn khi tìm kiếm (và sau này thay thế) tệp, không phải tôi đã tìm ra cách cơ bản nhất để loại trừ các tệp ẩn như được mô tả trong nhiều hướng dẫn trực tuyến không hoạt động đây.Tại sao tìm thấy. -not -name ". *" không loại trừ các tệp bị ẩn?

find . -not -name ".*" 

cũng sẽ in các tệp ẩn.

Các kịch bản tôi đang cố gắng để viết là

replace() { 
    if [ -n "$3" ]; then expr="-name \"$3\""; fi 
    find . -type f \($expr -not -name ".*" \) -exec echo sed -i \'s/$1/$2/g\' {} \; 
    unset expr 
} 
+0

'tìm. -not -name ". *" 'hoạt động với tôi. – fedorqui

+0

Sử dụng 'tìm. -not -name '. *' ', để tránh mở rộng vỏ. – Rubens

+0

là chính xác, nó vẫn tìm thấy (không ẩn) các tập tin trong thư mục ẩn. – user1273684

Trả lời

9

Vấn đề là -not -name ".*" không phù hợp với tất cả các file và thư mục bắt đầu bằng bất cứ điều gì nhưng "" - nhưng nó không cắt tỉa chúng khỏi tìm kiếm, vì vậy bạn sẽ nhận được các kết quả phù hợp từ các thư mục ẩn bên trong. Để prune đường dẫn sử dụng -prune, ví dụ:

find $PWD -name ".*" -prune -o -print 

(tôi sử dụng $PWD bởi vì nếu không khi bắt đầu tìm kiếm cũng sẽ được cắt tỉa và sẽ không có đầu ra "")

+0

Cảm ơn bạn, nhưng tôi vẫn còn một chút bị mất - tại sao 'tìm $ PWD -name '. *' -prune -o -name '* .c' -type f -print' làm việc nhưng không tìm thấy $ PWD - tên '. *' -prune -o $ expr -type f -print' với 'expr =" - name '* .c' "'? – user1273684

+1

Dấu ngoặc kép bạn nhúng vào giá trị của 'expr' không bị xóa sau khi' expr' được mở rộng; chúng được xử lý theo nghĩa đen. – chepner

+0

cảm ơn bạn, bây giờ nó hoạt động – user1273684

0

đúng phiên bản

replace() { 
     if [ -n "$3" ]; then expr=-name\ $3; fi 
     find $PWD -name '.*' -prune -o $expr -type f -exec sed -i s/$1/$2/g {} \; 
     unset expr 
} 
Các vấn đề liên quan