2011-10-01 62 views
5

Tôi đã sửa chữa một số thứ vào một thư mục đã chứa rất nhiều thứ. Thay vào đó, tôi muốn thay thế một thư mục riêng. Bây giờ có quá nhiều tệp để phân biệt giữa. Tuy nhiên, các tệp mà tôi đã không được khắc phục đã được tạo ngay bây giờ (phải không?) Và các tệp gốc chưa được sửa đổi trong thời gian dài (ít nhất một ngày). Có cách nào để xóa chỉ những tệp không được xác thực này dựa trên thông tin tạo của chúng không?Làm thế nào để xóa tất cả các tệp gần đây đã được tạo trong một thư mục trong linux?

Trả lời

6

Tar thường khôi phục dấu thời gian tệp, vì vậy việc lọc theo thời gian sẽ không hoạt động.

Nếu bạn vẫn có file tar, bạn có thể sử dụng nó để xóa những gì bạn giải nén với một cái gì đó như:

tar tf file.tar --quoting-style=shell-always |xargs rm -i 

trên sẽ làm việc trong hầu hết các trường hợp, nhưng không phải tất cả (tên tập tin đó có một vận chuyển trở lại trong họ sẽ phá vỡ nó), vì vậy hãy cẩn thận.

Bạn có thể xóa các thư mục bằng cách thêm -r vào điều đó, nhưng có thể an toàn hơn khi chỉ xóa các thư mục toplevel theo cách thủ công.

+2

Nó thực sự dễ dàng để làm cho nó làm việc với không gian trong tên tập tin, và đó sẽ là một câu trả lời tốt hơn nhiều. – Omnifarious

+0

@omnifa cách làm công việc này với không gian? để loại bỏ các thư mục được trích xuất, tôi cũng nên bao gồm -R sau khi rm? – AnkurVj

+0

@AnkurVj: Thật không may là không thực sự là một cách để làm cho tar cung cấp cho bạn một danh sách các tên tập tin rỗng tách biệt, điều này khá thất vọng. Và có, phải có một '-r' sau' rm'. Vì Mat không cập nhật câu trả lời, tôi sẽ tự đặt câu trả lời. – Omnifarious

3

tìm. -mtime -1 -type f | xargs rm

nhưng trước tiên hãy thử nghiệm với

tìm. -mtime -1 -type f | xargs echo

+2

Điều này sẽ tốt trừ hai điều. Đầu tiên, ** luôn luôn ** sử dụng '-print0' và' xargs -0'. Bạn không muốn các ký tự khoảng trống ngẫu nhiên trong tên tập tin gây ra vấn đề cho bạn. Thứ hai, 'tar' khôi phục dấu thời gian, vì vậy bạn không thể sử dụng mtime ở đây. Có lẽ lúc này, có thể, nếu hệ thống tập tin của bạn đã được cấu hình để cập nhật nó. – Omnifarious

+0

Ngoài ra, lưu ý ví dụ: find-mmin -10 cho các tệp được sửa đổi trong mười phút qua – sehe

1

Có một số câu trả lời khác nhau cho câu hỏi này để tăng độ phức tạp. Trước tiên, nếu đây là một lần tắt, và trong trường hợp cụ thể này, bạn hoàn toàn chắc chắn rằng không có ký tự lạ trong tên tệp của bạn (dấu cách là OK, nhưng không phải tab, dòng mới hoặc ký tự điều khiển khác, cũng không phải ký tự unicode) điều này sẽ hoạt động:

tar -tf file.tar | egrep '^(\./)?[^/]+(/)?$' | egrep -v '^\./$' | tr '\n' '\0' | xargs -0 rm -r 

Tất cả việc bỏ qua đó là bỏ qua tất cả các thư mục con của thư mục con.

Một cách khác để làm điều này làm việc với các tên tập sôi nổi là thế này:

mkdir foodir 
cd foodir 
tar -xf ../file.tar 
for file in *; do rm -rf ../"$file"; done 

Điều đó sẽ tạo ra một thư mục trong đó lưu trữ của bạn đã được mở rộng, nhưng có vẻ như bạn muốn mà đã anyway. Nó cũng sẽ không xử lý bất kỳ tệp nào có tên bắt đầu bằng ..

Để làm cho rằng phương pháp làm việc với các tập tin bắt đầu bằng ., làm điều này:

mkdir foodir 
cd foodir 
tar -xf ../file.tar 
find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 sh -c 'for file in "[email protected]"; do rm -rf ../"$file"; done' junk 

Cuối cùng, lấy từ Mat's answer, bạn có thể làm điều này và nó sẽ làm việc cho bất kỳ tên tập tin và không yêu cầu bạn phải tar sự thư mục một lần nữa:

tar -tf file.tar | egrep '^(\./)?[^/]+(/)?$' | grep -v '^\./$' | tr '\n' '\0' | xargs -0 bash -c 'for fname in "[email protected]"; do fname="$(echo -ne "$fname")"; echo -n "$fname"; echo -ne "\0"; done' junk | xargs -0 rm -r 
0

Bạn có thể xử lý các tập tin và thư mục trong một đường chuyền với:

tar -tf ../test/bob.tar --quoting-style=shell-always | sed -e "s/^\(.*\/\)'$/rmdir \1'/; t; s/^\(.*\)$/rm \1/;" | sort | bash 

Bạn có thể xem những gì sẽ xảy ra rời khỏi ống để 'bash'

tar -tf ../test/bob.tar --quoting-style=shell-always | sed -e "s/^\(.*\/\)'$/rmdir \1'/; t; s/^\(.*\)$/rm \1/;" | sort 

để xử lý tên tập tin với linefeeds bạn cần chế biến nhiều hơn nữa.

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