Si está en un sistema GNU, intente ejecutar su aplicación con:
LD_DEBUG=libs your-application
Ver LD_DEBUG=help
para más opciones o man ld.so
.
Чтобы просмотреть удаленные каталоги, просто вставьте-print
:
find. -type d -empty -print -delete
Это приведет к удалению любой под-иерархии под текущим пустым каталогом, при этом будут отображаться пути к удаленным каталогам.
Действие -delete
подразумевает -depth
, т. е. обход начнется снизу структуры каталога и будет продвигаться вверх (на глубину -первого -обхода ). Это означает, что в любом каталоге, который может рассматриваться как подлежащий удалению, уже будут обработаны его подкаталоги -(, и они будут удалены, если они были пусты ).
Пример:
$ mkdir -p 1/2/3/4/5/6
$ tree
.
`-- 1
`-- 2
`-- 3
`-- 4
`-- 5
`-- 6
6 directories, 0 file
$ find. -type d -empty -print -delete
./1/2/3/4/5/6
./1/2/3/4/5
./1/2/3/4
./1/2/3
./1/2
./1
$ tree
.
0 directory, 0 file
Если в одном каталоге есть файл:
$ mkdir -p 1/2/3/4/5/6
$ touch 1/2/3/file
$ tree
.
`-- 1
`-- 2
`-- 3
|-- 4
| `-- 5
| `-- 6
`-- file
6 directories, 1 file
$ find. -type d -empty -print -delete
./1/2/3/4/5/6
./1/2/3/4/5
./1/2/3/4
$ tree
.
`-- 1
`-- 2
`-- 3
`-- file
3 directories, 1 file
Чтобы вывести список каталогов, содержащих только подкаталоги, но не удаляя их (, используйтеbash
):
shopt -s globstar
for dir in./**/; do
if [ -z "$(find "$dir" ! -type d -exec echo x \;)" ]; then
printf '%s\n' "$dir"
fi
done
Это зациклится на всех подкаталогах в текущем каталоге (уединенно, используя **
глобус оболочки ), а затем попытается найти что-то, что не является каталогом ни в одном из них. Если что-то найдено, то этот каталог не пустой, в противном случае выводится путь к пустому каталогу.
В GNU find
вы можете добавить -quit
в самый конец приведенной выше команды find
(после \;
), чтобы немного ускорить процесс.
Чтобы напечатать пустые каталоги, не удаляя их, нам нужно сделать больше, чем просто удалить пустые каталоги с краев вверх.
Что-то вроде этого может сработать:
find dir/ -type d ! -exec sh -c \
'find "$1" ! -type d -print -quit | grep -q. >/dev/null' sh {} \; -print
Внешний find
находит каждый каталог и запускает другойfind
для каждого из них. Внутренний find
проверяет, содержит ли этот каталог (рекурсивно )какие-либо каталоги, отличные от -, и возвращает истинное значение, если это так. Внешний find
затем печатает каждый каталог, который вернул false (, т.е. не содержит каталогов, отличных от -).
Однако это довольно медленно с рекурсивным find
s. Лучшее решение может включать кэширование каталогов, в которых были найдены файлы, или подход, который будет начинаться с пустых каталогов и работать до ветки, содержащей файл (s ).