2010-12-15 47 views
8

Tôi có một thư mục chứa một số kiểm tra sửa đổi lật đổ (chúng được kiểm tra khi chạy công thức triển khai capistrano).cách xóa tất cả các tệp trừ ba tệp mới nhất trong một thư mục

những gì tôi muốn thực sự là giữ 3 bản sửa đổi mới nhất mà kịch bản capistrano kiểm tra và xóa các bản khác, vì vậy tôi dự định chạy một số lệnh trên thiết bị đầu cuối bằng lệnh chạy, thực sự là capistrano hasn ' t có bất cứ điều gì để làm ở đây, nhưng một lệnh unix.

Tôi đã cố gắng chạy lệnh để nhận danh sách tệp ngoại trừ ba tệp mới nhất và xóa phần còn lại, tôi có thể lấy danh sách tệp bằng lệnh sau.

(ls -t /var/path/to/folder |head -n 3; ls /var/path/to/folder)|sort|uniq -u|xargs 

bây giờ nếu tôi thêm rm -Rf vào cuối lệnh này sẽ trả về cho tôi với tệp không tìm thấy để xóa. vì vậy điều đó hiển nhiên bởi vì nó chỉ trả về tên của thư mục, chứ không phải đường dẫn đầy đủ đến thư mục.

có cách nào khác để xóa các tệp/thư mục này bằng một lệnh unix không?

Trả lời

13

Được rồi, có một vài điều sai với tập lệnh của bạn.

Thứ nhất, và còn gì phải bàn nhất, là dòng này:

ls -t /var/path/to/folder |head -n 3; 

ls -t sẽ trả về một danh sách các file theo thứ tự thời gian sửa đổi cuối cùng của họ, bắt đầu với gần đây nhất là sửa đổi. head -n 3 nói chỉ liệt kê ba dòng đầu tiên. Vì vậy, điều này nói là "cung cấp cho tôi danh sách chỉ ba tệp được sửa đổi gần đây nhất", mà tôi không nghĩ là những gì bạn muốn.

Tôi không thực sự chắc chắn những gì bạn đang làm với lệnh thứ hai ls, nhưng tôi khá chắc chắn đó là chỉ cần ghép tất cả các tệp trong thư mục vào danh sách của bạn. Điều đó có nghĩa là khi nó được sort ed và uniq 'ed, bạn sẽ chỉ còn lại với một danh sách theo thứ tự chữ cái của tất cả các tệp trong thư mục đó. Khi điều này được chuyển đến một cái gì đó như xargs rm, bạn sẽ xóa sạch tất cả mọi thứ mọi thứ trong thư mục đó.

Tiếp theo, sort | uniq không cần phần uniq. Bạn chỉ có thể sử dụng công tắc -u trên sort để loại bỏ các bản sao. Bạn không cần phần này anyway.

Cuối cùng, việc xóa thư mục thực sự. Về phần này, bạn đã có nó ngay trong câu hỏi của bạn: chỉ cần sử dụng rm -r

Dưới đây là cách dễ nhất tôi có thể nghĩ để làm điều này:

ls -t1 /var/path/to/folder | tail -n +4 | xargs rm -r 

Dưới đây là những gì đang xảy ra ở đây:

  • ls -t1 là in danh sách, một tệp/thư mục trên mỗi dòng, của tất cả các tệp trong /var/path/to/folder, sắp xếp theo ngày sửa đổi gần đây nhất gần đây nhất.
  • tail -n +4 đang in tất cả các dòng trong đầu ra của ls -t1 bắt đầu bằng dòng thứ tư (tức làba tệp được sửa đổi gần đây nhất sẽ không được liệt kê)
  • xargs rm -r nói để xóa bất kỳ đầu ra tệp nào từ tail. -r có nghĩa là đệ quy xóa các tập tin, vì vậy nếu nó gặp một thư mục, nó sẽ xóa tất cả mọi thứ trong thư mục đó, sau đó xóa các thư mục riêng của mình.

Lưu ý rằng tôi không sắp xếp bất kỳ thứ gì hoặc xóa bất kỳ bản trùng lặp nào. Đó là bởi vì:

  • ls chỉ báo cáo một tập tin một lần, vì vậy không có bản sao để loại bỏ
  • Bạn đang xóa tất cả các tập tin thông qua anyway, do đó nó không quan trọng để những gì họ đang bị xóa.

Tất cả điều đó có ý nghĩa không?

Edit:

Kể từ khi tôi đã sai về ls xác định đường dẫn đầy đủ khi thông qua một thư mục tuyệt đối, và kể từ khi bạn có thể không có khả năng để thực hiện một cd, có lẽ bạn có thể sử dụng tail để thay thế.

Ví dụ:

ls -t1 /var/path/to/folder | tail -n +4 | xargs find /var/path/to/folder -name $1 | xargs rm -r 
+0

Hi cảm ơn bạn đã trả lời, nhưng tôi vẫn có được các tập tin chỉ tên, một trong những nhu cầu chính của tôi là chạy mã này từ bất kỳ thư mục nào của máy chủ và xóa các tệp trong thư mục var/path/to/này hoạt động tốt nếu tôi ở cùng thư mục var/path/to/folder – nivanka

+0

@ nivanka: Điều đó thực sự kỳ lạ. Bạn có chỉ định đường dẫn tương đối hay tuyệt đối không? Bạn cần chỉ định đường dẫn tuyệt đối nếu bạn muốn chạy đường dẫn này từ bất kỳ thư mục nào trên máy chủ. Bạn có thể sao chép/dán lệnh * chính xác * mà bạn đang sử dụng không? – AgentConundrum

+0

hi, đây là những gì tôi làm ls -t1/var/path/to/folder | tail -n +4 | xargs rm -r – nivanka

0

Hi Tôi tìm thấy một cách để làm điều này, chúng ta có thể sử dụng unix & &

do đó lệnh sẽ trông như thế này

cd /var/path/to/folder && ls -t1 /var/path/to/folder | tail -n +4 | xargs rm -r 
1

Dưới đây là một cách hữu ích để thực hiện nhiệm vụ ....... !!

cho Linux và HP-UX:

ls -t1 | tail -n +50 | xargs rm -r # để lại 50 tệp/thư mục mới nhất.

cho SunOS:

rm `(ls -t | head -n 100; ls) | sort | uniq -u`

Các vấn đề liên quan