2013-07-30 46 views
9

Tôi đang viết một tập lệnh cần xóa mọi thứ khỏi thư mục ngoại trừ hai thư mục, mysql và temp.Bash. Xóa tất cả các tệp và thư mục nhưng một số tệp nhất định

Tôi đã thử điều này:

ls * | grep -v mysql | grep -v temp | xargs rm -rf 

nhưng điều này cũng giữ tất cả các file có mysql trong tên của họ, mà tôi không cần. nó cũng không xóa bất kỳ thư mục nào khác.

bất kỳ ý tưởng nào?

Trả lời

21

Bạn có thể thử:

rm -rf !(mysql|init) 

Đó là POSIX defined:

Glob patterns can also contain pattern lists. A pattern list is a sequence 
of one or more patterns separated by either | or &. ... The following list 
describes valid sub-patterns. 

... 
!(pattern-list): 
    Matches any string that does not match the specified pattern-list. 
... 

Note: Xin vui lòng, mất thời gian để kiểm tra nó trước! Hoặc tạo ra một số thư mục kiểm tra, hoặc đơn giản là echo tham số thay thế, như ghi nhận của uỷ @mnagel:

echo !(mysql|init) 

Adding useful information: nếu phù hợp không phải là hoạt động, bạn có thể để cho phép/vô hiệu hóa nó bằng cách sử dụng:

shopt extglob     # shows extglob status 
shopt -s extglob    # enables extglob 
shopt -u extglob    # disables extglob 
+0

hoạt động như một sự quyến rũ! cảm ơn! (chắc chắn đã được thử nghiệm ở một nơi khác, không muốn phá vỡ mọi thứ) – Bobo

+0

Nếu điều này trả lời câu hỏi của bạn, hãy đánh dấu câu trả lời là được chấp nhận. Cả hai đều cho phép người khác biết câu hỏi đã được trả lời, vì nó có nghĩa là bạn thừa nhận những nỗ lực của người khác để giúp bạn. Để chấp nhận câu trả lời, nhấp vào dấu chọn, bên dưới mũi tên bỏ phiếu. – Rubens

+0

làm việc trên đó. tôi phải đợi thêm 1 phút nữa. – Bobo

1

Bạn có thể sử dụng tìm, bỏ qua mysql và temp rồi rm -rf chúng.

find . ! -iname mysql ! -iname temp -exec rm -rf {} \; 
+4

điều này cũng xóa các tệp bên trong hai thư mục – Bobo

+0

Để không xóa mọi thứ bên trong các thư mục này, hãy sử dụng 'find. -maxdepth 1! -iname mysql! -iname temp -exec rm -rf {} \;', hoặc thậm chí còn tốt hơn 'tìm. -maxdepth 1! - mysql iname!-iname temp -delete' – mikewaters

2

Đây thường là công việc cho find. Hãy thử các lệnh sau (thêm -rf nếu bạn cần một đệ quy xóa):

find . -maxdepth 1 \! \(-name mysql -o -name temp \) -exec rm '{}' \; 

(Nghĩa là, tìm mục trong . nhưng không phải thư mục con mà không phải là [tên mysql hoặc tên tmp] và gọi rm trên chúng.)

+0

điều này cũng xóa các tập tin bên trong hai thư mục – Bobo

+0

Không có tùy chọn 'maxdepth'. Loại bỏ '-exec rm '{}' \;' để lấy danh sách các tệp phù hợp, sẽ không bao gồm bất kỳ thứ gì bên dưới '. /'. – chrylis

+1

Điều này cũng trả về '.', vì vậy nếu bạn đang thực hiện' rm -Rf', có khả năng có thể xóa nhiều hơn bạn dự định ... –