2010-01-06 37 views
130

Có ai có giải pháp để loại bỏ các tệp ._ và .DS_Store pesky mà một tệp nhận được sau khi di chuyển tệp từ máy Mac sang máy chủ Linux không?Bash: đệ quy xóa các tệp

chỉ định thư mục bắt đầu và để thư đi? như/var/www/html/xuống ...

+0

Mặc dù đây không phải là IMO trùng lặp, bạn nên dùng ook lúc này: http://stackoverflow.com/questions/1280429/delete-all-files-but-keep-all-directories-in-a-bash-script – Grundlefleck

+0

Mặc dù không phải là những gì bạn đang yêu cầu. Tôi cho rằng đây là giải pháp tốt hơn: http://unix.stackexchange.com/questions/9665/create-tar-archive-of-a-directory-except-for-hidden-files – Viktor

Trả lời

12
cd /var/www/html && find . -name '.DS_Store' -print0 | xargs -0 rm 
cd /var/www/html && find . -name '._*' -print0 | xargs -0 rm 
+2

Tôi thích cái này tốt hơn đơn giản vì "rm" không có "-r" không cần thiết cho tác vụ cụ thể này. – lotsoffreetime

4
find . -name "FILE-TO-FIND"-exec rm -rf {} \; 
+0

Sử dụng lệnh exec cho mỗi tệp được tìm thấy không nhanh. Nó nhanh hơn để tìm in chúng ra và sau đó sử dụng xargs để gọi rm một lần. –

+3

Tuy nhiên, nếu bạn có 'tìm' hỗ trợ nó,' + 'giống như xargs:' find. -name "FILE-TO-FIND" -exec rm -rf {} + '- (ngoài ra, bạn đang thiếu một dấu cách trước' -exec') –

+2

chúng ta chưa bao giờ có xargs trong ngày của mình. Và chúng tôi đã phải đi bộ đến trường, lên dốc cả hai cách ....... –

160

thay đổi vào thư mục, và sử dụng:

find . -name ".DS_Store" -print0 | xargs -0 rm -rf 
find . -name "._*" -print0 | xargs -0 rm -rf 

Không kiểm tra, thử chúng mà không có sự xargs đầu tiên!

Bạn có thể thay thế khoảng thời gian sau khi tìm, với thư mục thay vì thay đổi thư mục trước.

find /dir/here ... 
+2

Tôi biết câu hỏi của anh ấy đã không yêu cầu, nhưng tôi không bao giờ có thể nhớ: ví dụ của bạn có xử lý tên tệp với không gian không? – Grundlefleck

+4

Vâng, đó là những gì print0 và -0 đến xargs là cho. Thông thường nó sẽ không xử lý không gian chính xác, tuy nhiên với print0 nó sẽ in tên tập tin với một ký tự null ở cuối dòng, mà xarg với -0 sẽ sử dụng để chuyển toàn bộ đường dẫn tới xarg mà không có khoảng trắng được sử dụng một tham số thứ hai hoặc thứ ba để lệnh rm có thể thực sự xấu! –

+0

@ X-Istence - Điều này wont đệ quy đi tiểu thư mục mặc dù phải không? –

6

Bạn có thể chuyển sang zsh thay vì bash. Điều này cho phép bạn sử dụng ** để phù hợp với các file ở bất cứ đâu trong một cây thư mục:

$ rm /var/www/html/**/_* /var/www/html/**/.DS_Store 

Bạn cũng có thể kết hợp chúng như thế này:

$ rm /var/www/html/**/(_*|.DS_Store) 

Zsh có rất nhiều tính năng khác mà bash thiếu, nhưng một trong đó một mình là giá trị làm cho việc chuyển đổi cho. Nó có sẵn trong hầu hết các bản phân phối Linux, cũng như cygwin và OS X.

Bạn có thể tìm thêm thông tin về số zsh site.

+1

Một vấn đề có thể xảy ra: vì bạn không sử dụng xargs, bạn có thể chạy vào giới hạn chiều dài đối số dòng lệnh.Ngoài ra, Bash 4 hỗ trợ '**' quá :-) (mặc dù không theo mặc định, 'cửa hàng -s globstar' cần được thiết lập) – ephemient

89
find /var/www/html \(-name '.DS_Store' -or -name '._*' \) -delete 
+9

Cờ' -delete' là tuyệt vời, cảm ơn. –

+1

Điều này rất hữu ích, cảm ơn! – corazza

+2

+1 cho -delete, thx – Chris

1

nếu bạn có Bash 4.0 ++

#!/bin/bash 
shopt -s globstar 
for file in /var/www/html/**/.DS_Store /var/www/html/**/._ 
do 
echo rm "$file" 
done 
+2

Chạy bản sao rm mới cho mỗi tệp là lãng phí. –

+2

@ X-Istence tối ưu hóa sớm là lãng phí – Lucina

+8

Chuối rất ngon .... – Matt

18

đơn giản lệnh:

rm `find ./ -name '.DS_Store'` -rf 
rm `find ./ -name '._'` -rf 

Chúc may mắn!

+1

Điều này làm việc tuyệt vời. NHƯNG một lời cảnh cáo, tôi chỉ sử dụng 'rm -i 'find ./ -name' * py'' -rf', nó KHÔNG nhắc tôi xóa các tập tin. bạn sẽ cần phải mang nó vào cuối (tức là '-rfi'). Cảm ơn thần cho kịch bản sao lưu của tôi. – ryanjdillon

+1

Nếu có quá nhiều tệp bị hỏng với lỗi: '-bash:/bin/rm: Danh sách đối số quá dài' – Viktor

78

findutils Mới hơn hỗ trợ -delete, vì vậy:

find . -name ".DS_Store" -delete 

sẽ làm việc cho bạn nếu bạn có một hệ thống POSIX up-to-date, tôi tin. Ít nhất nó hoạt động đối với tôi trên OS X 10.8,

Ghi có để @ nhận được trong nhận xét về bài đăng @ X-Istence (nghĩ rằng nó đủ hữu ích để đảm bảo câu trả lời của riêng mình).

+1

Hoạt động trở lại trong OSX 10.6. – hoss

+3

Giải pháp sạch và đơn giản nhất, +1! – limist

+6

@OneOfOne: như bình luận của tôi nói, tôi nhận được điều này từ @ ephemient. Là một người mới bắt đầu để bash, tôi thấy giải pháp của bạn (có lẽ chính xác hơn) ít dễ đọc hơn và có thể sử dụng được. Chúng có thể giống nhau về mặt chức năng nhưng tôi thấy cú pháp này cung cấp sự rõ ràng hơn. – rattray

1

Một số điều cần lưu ý:

'-delete' không đệ quy. Vì vậy, nếu .TemporaryItems (thư mục) có các tệp trong đó, lệnh không thành công.

Có rất nhiều những tập tin này pesky tạo ra bởi Mac:. .DS_Store ._ DS_Store .TemporaryItems .apdisk

này một địa chỉ lệnh tất cả trong số họ. Tiết kiệm từ chạy tìm thấy hơn và hơn nữa cho nhiều trận đấu.

find /home/foo \(-name '.DS_Store' -or -name '._.DS_Store' -or -name '._*' -or -name '.TemporaryItems' -or -name '.apdisk' \) -exec rm -rf {} \; 
3

Ví dụ để xóa "Hình thu nhỏ.db" đệ quy;

find . -iname "Thumbs.db" -print0 | xargs -0 rm -rf 

Validate bởi:

find . -iname "Thumbs.db" 

này nên bây giờ, không hiển thị bất kỳ của các mục với "Thumbs.db", bên trong đường dẫn hiện tại

3

Nó là tốt hơn. để xem nội dung đang xóa bằng cách thêm dấu vân tay vào this answer

find /var/www/html \(-name '.DS_Store' -or -name '._*' \) -delete -print 
Các vấn đề liên quan