...
|
...
|
@@ -599,6 +599,8 @@ def cmd_object_del(args):
|
599
|
599
|
|
600
|
600
|
if not recursive:
|
601
|
601
|
rc = subcmd_object_del_uri(uri_str)
|
|
602
|
+ elif Config.exclude:
|
|
603
|
+ rc = subcmd_batch_del(uri_str = uri_str)
|
602
|
604
|
else:
|
603
|
605
|
rc = subcmd_batch_del_iterative(uri_str = uri_str)
|
604
|
606
|
if not rc:
|
...
|
...
|
@@ -606,7 +608,15 @@ def cmd_object_del(args):
|
606
|
606
|
return EX_OK
|
607
|
607
|
|
608
|
608
|
def subcmd_batch_del_iterative(uri_str = None, bucket = None):
|
609
|
|
- """ Streaming version of batch deletion (doesn't realize whole list in memory before deleting) """
|
|
609
|
+ """ Streaming version of batch deletion (doesn't realize whole list in memory before deleting).
|
|
610
|
+
|
|
611
|
+ Differences from subcmd_batch_del:
|
|
612
|
+ - Obeys cfg.max_delete, but if it is >1000, will delete files until we are sure that at least
|
|
613
|
+ that many files are to be deleted
|
|
614
|
+ - Only prints out individual file names if <1000 files are to be deleted
|
|
615
|
+ - Does not obey --exclude directives (use subcmd_batch_del in those cases)
|
|
616
|
+
|
|
617
|
+ """
|
610
|
618
|
if bucket and uri_str:
|
611
|
619
|
raise ValueError("Pass only one of uri_str or bucket")
|
612
|
620
|
if bucket: # bucket specified
|
...
|
...
|
@@ -632,19 +642,35 @@ def subcmd_batch_del_iterative(uri_str = None, bucket = None):
|
632
|
632
|
to_delete[:] = []
|
633
|
633
|
_status()
|
634
|
634
|
|
|
635
|
+ def _check_max_delete():
|
|
636
|
+ """ Return True if ok to delete """
|
|
637
|
+ if cfg.max_delete > 0 and len(to_delete) + deleted[0] > cfg.max_delete:
|
|
638
|
+ warning(u"delete: maximum requested number of deletes would be exceeded, %s performed." % deleted[0])
|
|
639
|
+ to_delete[:] = []
|
|
640
|
+ return False
|
|
641
|
+ return True
|
|
642
|
+
|
|
643
|
+ deleted_at_least_1000 = False
|
635
|
644
|
for is_dir, obj in recurse(s3, uri, recursive=True):
|
636
|
645
|
if is_dir:
|
637
|
646
|
continue
|
638
|
647
|
to_delete.append(obj)
|
639
|
648
|
if len(to_delete) >= 1000:
|
640
|
|
- if cfg.max_delete > 0 and len(to_delete) + deleted[0] > cfg.max_delete:
|
641
|
|
- warning(u"delete: maximum requested number of deletes would be exceeded, %s performed." % deleted[0])
|
642
|
|
- to_delete[:] = []
|
643
|
|
- break
|
644
|
|
- _delete()
|
|
649
|
+ if _check_max_delete():
|
|
650
|
+ deleted_at_least_1000 = True
|
|
651
|
+ _delete()
|
|
652
|
+ else:
|
|
653
|
+ return False
|
645
|
654
|
|
646
|
655
|
if to_delete:
|
647
|
|
- _delete()
|
|
656
|
+ if _check_max_delete():
|
|
657
|
+ if not deleted_at_least_1000:
|
|
658
|
+ output('\n'.join(u"File %s deleted" % uri.compose_uri(bucket, p['Key']) for p in to_delete))
|
|
659
|
+ _delete()
|
|
660
|
+ else:
|
|
661
|
+ return False
|
|
662
|
+
|
|
663
|
+ return EX_OK
|
648
|
664
|
|
649
|
665
|
def subcmd_batch_del(uri_str = None, bucket = None, remote_list = None):
|
650
|
666
|
"""
|