diff --git a/cli/nanoshare_client/ignore.py b/cli/nanoshare_client/ignore.py
index d02542b..e07903a 100644
--- a/cli/nanoshare_client/ignore.py
+++ b/cli/nanoshare_client/ignore.py
@@ -46,6 +46,8 @@ def is_ignored(rel_path: str, patterns: list[str]) -> bool:
if pattern.endswith('/'):
if path == normalized or path.startswith(f'{normalized}/'):
return True
+ if any(fnmatch(part, normalized) for part in parts):
+ return True
continue
if '/' in normalized:
if fnmatch(path, normalized):
diff --git a/cli/pyproject.toml b/cli/pyproject.toml
index 738f08a..aa2ca8f 100644
--- a/cli/pyproject.toml
+++ b/cli/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "nanoshare-cli"
-version = "0.4.1"
+version = "0.4.2"
description = "NanoShare desktop CLI and folder sync client"
readme = "README.md"
requires-python = ">=3.11"
diff --git a/tests/test_nanoshare_cli.py b/tests/test_nanoshare_cli.py
index 094f295..db5b1a1 100644
--- a/tests/test_nanoshare_cli.py
+++ b/tests/test_nanoshare_cli.py
@@ -213,6 +213,8 @@ def test_sync_ignores_local_files_from_nanoshareignore(tmp_path, monkeypatch):
(tmp_path / 'scratch.tmp').write_text('ignored')
(tmp_path / '.comments').mkdir()
(tmp_path / '.comments' / 'ignored.xml').write_text('')
+ (tmp_path / 'Cerberus' / '.comments').mkdir(parents=True)
+ (tmp_path / 'Cerberus' / '.comments' / '76. Two-headeds.PNG.xml').write_text('')
(tmp_path / '.env').write_text('SECRET=ignored')
(tmp_path / '.venv').mkdir()
(tmp_path / '.venv' / 'ignored.py').write_text('ignored')
@@ -261,6 +263,7 @@ def test_default_ignore_patterns_skip_common_generated_files(tmp_path):
patterns = load_ignore_patterns(tmp_path)
assert is_ignored('.comments/comment.xml', patterns)
+ assert is_ignored('Cerberus/.comments/76. Two-headeds.PNG.xml', patterns)
assert is_ignored('.env', patterns)
assert is_ignored('.env.local', patterns)
assert is_ignored('.venv/bin/python', patterns)