Предположим, у меня есть дерево каталогов, подобное этому:
ROOTDIR
└--SUBDIR1
└----SUBDIR2
└----SUBDIR3
Я ищу команду, которая при вводе:
$ [unknown command] ROOTDIR
Все дерево каталогов может быть удалено, если в нем нет файла, а есть только каталоги . Однако, скажем, если есть файл с именем hello.pdf в SUBDIR1:
ROOTDIR
└--SUBDIR1
└--hello.pdf
└----SUBDIR2
└----SUBDIR3
Тогда команда должна удалить только SUBDIR2 и ниже.
Ответы:
Алексис близко Что вам нужно сделать, это:
Это сначала развернет дерево каталогов, пока не найдет первый пустой каталог, а затем удалит его. Таким образом, создание родительского каталога пустым, который затем будет удален и т. Д. Это даст желаемый эффект (я делаю это, вероятно, 10 раз в неделю, поэтому я почти уверен, что это правильно). :-)
источник
-depth
нужен вариант?find . -type d -empty -exec rmdir "{}" \;
тоже должно работать .... верно?foo/bar/baz
. Если вы не используете-depth
, он будет пытаться удалитьfoo
сначала, потерпеть неудачу, и вы получите в результатеfoo/bar
после запуска.+
вместо того,;
чтобы вы пакетно удаляли каталоги. Поскольку вы делаете это в глубину, дети все равно будут удалены раньше родителей (возможно, это зависит от вашей версии rmdir / bash и зависит от того, не удалит ли rmdir непустые каталоги). Это работает для меня в Bash наmkdir -p a/b/c/d ; find a -depth -type d -exec rmdir {} +
такой же как
но использует встроенное действие "-delete".
Обратите внимание, что «-delete» подразумевает «-depth».
источник
Я бы попробовал это:
источник
Вот некоторые требования, прежде чем мы сможем сделать это безопасно:
Вот как я это сделаю в оболочке:
Если вы не возражаете против некоторых избыточных ошибок, вы можете просто принудительно удалить все каталоги с родителями, и вам не нужно выполнять какую-либо сортировку (вы не можете сортировать завершенные строки NUL, что добавляет необходимость в tr)
источник
-empty -delete
опцияхfind
в ответе @ go2null.источник
find
потому чтоfind
есть способ сделать обработку чисто:find … -exec
.Я бы сделал это:
источник