diff --git a/Dockerfile b/Dockerfile index 9fec5d658..67b04fc28 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,7 +15,7 @@ WORKDIR /usr/src RUN \ set -x \ && apk add --no-cache \ - coreutils \ + findutils \ eudev \ eudev-libs \ git \ diff --git a/supervisor/utils/__init__.py b/supervisor/utils/__init__.py index dc2235992..1e49a5b5d 100644 --- a/supervisor/utils/__init__.py +++ b/supervisor/utils/__init__.py @@ -105,30 +105,36 @@ async def remove_folder( if any(item.match(exclude) for exclude in excludes): moved_files.append(item.rename(temp_path / item.name)) - del_folder = f"{folder}" + "/{,.[!.],..?}*" if content_only else f"{folder}" + find_args = [] + if content_only: + find_args.extend(["-mindepth", "1"]) try: proc = await asyncio.create_subprocess_exec( - "bash", - "-c", - f"rm -rf --one-file-system {del_folder}", + "/usr/bin/find", + folder, + "-xdev", + *find_args, + "-delete", stdout=asyncio.subprocess.DEVNULL, + stderr=asyncio.subprocess.PIPE, env=clean_env(), ) _, error_msg = await proc.communicate() except OSError as err: - error_msg = str(err) + _LOGGER.exception("Can't remove folder %s: %s", folder, err) else: if proc.returncode == 0: return + _LOGGER.error( + "Can't remove folder %s: %s", folder, error_msg.decode("utf-8").strip() + ) finally: if excludes: for item in moved_files: item.rename(folder / item.name) temp.cleanup() - _LOGGER.error("Can't remove folder %s: %s", folder, error_msg) - def clean_env() -> dict[str, str]: """Return a clean env from system."""