diff options
author | Krzysztof Goj <krzysztof.goj@gmail.com> | 2012-01-22 01:39:59 +0100 |
---|---|---|
committer | Jim Meyering <meyering@redhat.com> | 2012-08-14 18:54:16 +0200 |
commit | fdc2da7165d93c8065365999341173ad2a818833 (patch) | |
tree | 25ef66176016b61abb71b56175b6cdb42fb54ee4 /src/remove.c | |
parent | 46afefaaa8ea95b5eb63a62792774cd18738234a (diff) | |
download | coreutils-fdc2da7165d93c8065365999341173ad2a818833.tar.xz |
rm: new option --dir (-d) to remove empty directories
Add new option to rm (-d/--dir), which allows removal of
empty directories, while still safely disallowing removal
of non-empty ones.
This improves compatibility with Mac OS X and BSD systems,
which honor the -d option.
* src/remove.c (rm_fts): Remove empty directories when requested.
* src/remove.h (rm_options) [remove_empty_directories]: New member.
* src/rm.c (long_opts, usage, main): Update usage and option parsing.
(rm_option_init): Initialize the new member.
* src/mv.c (rm_option_init): Initialize the new member.
* tests/rm/d-1: New test case - successfully delete empty dir.
* tests/rm/d-2: New test case - refuse to delete nonempty dir.
* tests/Makefile.am (TESTS): Add them.
Diffstat (limited to 'src/remove.c')
-rw-r--r-- | src/remove.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/src/remove.c b/src/remove.c index 5ebd2ce43..61ba5f372 100644 --- a/src/remove.c +++ b/src/remove.c @@ -414,11 +414,15 @@ rm_fts (FTS *fts, FTSENT *ent, struct rm_options const *x) switch (ent->fts_info) { case FTS_D: /* preorder directory */ - if (! x->recursive) + if (! x->recursive + && !(x->remove_empty_directories + && is_empty_dir (fts->fts_cwd_fd, ent->fts_accpath))) { - /* This is the first (pre-order) encounter with a directory. + /* This is the first (pre-order) encounter with a directory + that we can not delete. Not recursive, so arrange to skip contents. */ - error (0, EISDIR, _("cannot remove %s"), quote (ent->fts_path)); + int err = x->remove_empty_directories ? ENOTEMPTY : EISDIR; + error (0, err, _("cannot remove %s"), quote (ent->fts_path)); mark_ancestor_dirs (ent); fts_skip_tree (fts, ent); return RM_ERROR; |