Permissions Don't Move: A /work/<group> Survival Guide
Putting files into a shared /work/<group>/ folder is a three-layer problem: get the group right, get the mode bits right, and get the ACL inherited. /work/<group>/ automatically wires layers 1 and 3 when you create new entries inside; layer 2 depends on how you transferred the file (Linux cp / rsync needs chmod — or set umask 0007 up front; Windows Explorer and macOS Finder via SMB let Samba fill it). mv from ~/ breaks all three.
Companion pages
- Lesson 2 — Tooling Setup —
/homevs/scratchplacement - Know Your Nodes — Storage internals — the broader Aqua filesystem picture
- QUT eResearch — Filesystem and data management1 — the canonical line on
/work/
The mental model
A shareable file in /work/<group>/ needs three things working together:
| Layer | What it means | Who sets it |
|---|---|---|
| 1. Group | File group = <group> (so collaborators are in-group) |
Automatic on create, via the dir's setgid bit |
| 2. Mode bits | File mode group bits include the access you want (rw for edit, r for read) |
Depends on the transfer method — see § How your transfer method sets layer 2 |
| 3. ACL | group:<group>:rwx entry + default ACL for future children |
Automatic on create, via the dir's default ACL |
What /work/<group>/ gives you — and doesn't — automatically
flowchart LR
Create([Create a new entry<br/>inside /work/<group>/]) --> L1[Layer 1<br/>group=<group><br/>via setgid]
Create --> L3[Layer 3<br/>ACL entries inherited<br/>via default ACL]
Create --> L2{Layer 2<br/>who sets mode bits?}
L2 -->|Linux cp / rsync from ~/| L2a[source mode ∩ umask<br/>chmod after, OR<br/>set umask 0007]
L2 -->|Windows / macOS SMB| L2b[Samba create_mask<br/>hpc-fs configured well<br/>usually done]
style Create fill:#e1f5fe
style L1 fill:#e8f5e8
style L3 fill:#e8f5e8
style L2 fill:#fff3e0
style L2a fill:#fff3e0
style L2b fill:#e8f5e8
The mode-bit gap only fires when the transfer propagates source mode bits. Linux cp and rsync -rlt --no-perms do — they inherit layers 1 + 3 from the parent dir but push the source file's mode bits into layer 2 (usually too restrictive because your umask defaults to 0022). Windows Explorer and macOS Finder via SMB don't — there's no POSIX mode on the client side to propagate, so Samba's server-side create_mask fills layer 2 instead. See § How your transfer method sets layer 2 for the client-by-client breakdown.
Empirically for Linux transfers on /work/<group> with default umask 0022:
What you bring in from ~/ via cp or rsync --no-perms |
Mode at destination | Effective group access |
|---|---|---|
File created with plain touch / cp (mode 0644) |
-rw-r-----+ |
r-- — group can read, not write |
File you chmod 600 for privacy |
-rw-------+ |
--- — group can't even read |
File you explicitly chmod 664 |
-rw-rw----+ |
rw- — group can read + write ✓ |
The ACL entry says group:<group>:rwx in all three cases, but the file's mode-bit mask gates effective access down to whatever the source mode permitted. For Linux transfers with default umask, you either chmod after each transfer or set umask 0007 up front — see the tip at the top of § Shared-edit transfers.
Here's what a correctly-wired shared folder looks like:
$ ls -ld /work/<group>
drwxrws---+ <user> <group> /work/<group>
$ getfacl -p /work/<group>
# file: /work/<group>
# owner: <user>
# group: <group>
# flags: -s-
user::rwx
group::rwx
other::---
default:user::rwx
default:group::rwx
default:group:<group>:rwx
default:mask::rwx
default:other::---
Two markers in ls -ld: s in column 6 = setgid (layer 1), + at the end = default ACLs present (layer 3). Both fire on create; neither sets layer 2. If either marker is missing, the folder isn't fully wired — open an eResearch Help Centre ticket.
What mv from ~/ breaks
mv is a rename, not a create. It bypasses both layer 1 and layer 3 inheritance AND propagates your ~/ mode bits to layer 2. You inherit nothing useful and keep three problems:
- Group: your
default, not<group>(collaborators are out-group) - Mode bits: whatever the file had in
~/(probably restrictive) - ACL: none at all (no entry, no future inheritance)
mv is the worst case — every other "wrong" method gets at least one layer right.
How your transfer method sets layer 2
Layers 1 and 3 depend on where the file lands (the parent dir's setgid + default ACL — see § The mental model). Layer 2 depends on how it lands, and that varies by transfer method:
| Transfer method | Source of layer-2 mode bits | Typical result on /work/<group> |
Post-transfer chmod? |
|---|---|---|---|
Linux mv from ~/ |
Source file, preserved wholesale (rename, no create) | -rw------- typical |
Yes (chgrp + chmod) |
Linux cp from ~/ (default umask 0022) |
Source mode bits, masked by umask | -rw-r-----+, group r-- only |
Yes (chmod g+w) |
Linux cp from ~/ with umask 0007 |
Source mode bits, masked by permissive umask | -rw-rw----+, group rw- effective |
No ✓ |
Linux rsync --no-perms from ~/ |
Same behavior as cp — masked by umask |
-rw-r-----+ with default umask 0022; -rw-rw----+ with umask 0007 |
Yes with default umask; no with umask 0007 ✓ |
Linux rsync --chmod=Dg+rwX,Fg+rw,o-rwx from ~/ |
Explicit override at transfer time — dirs get rwx, files get rw |
Dirs drwxrws---+, files -rw-rw----+; group rwx / rw- effective |
No ✓ |
Linux rsync -a from ~/ |
Source file's exact mode bits (breaks layer 1 too) | Same as source; source group leaks | Yes (chgrp + chmod) |
Windows Explorer via SMB (\\hpc-fs\work) |
Samba's server-side create_mask |
Folders drwxrws---+ (2770); files -rw-rw----+ (660) or -rw-rwx---+ (670); group rwx effective |
No for shared-edit; chmod u+x for scripts (see Windows tab) |
macOS Finder via SMB (smb://hpc-fs/work/) |
Same Samba as Windows Explorer | Same three-layer shape as Windows | No for shared-edit — but Finder emits ._filename sidecars per file (see Finder tab) |
The Linux rows share one root cause — the transfer preserves the source file's mode bits, and those bits are usually too restrictive because they were shaped by your umask on a single-user ~/. Change the umask (or use rsync --chmod) and the gap closes without any post-transfer chmod. The SMB rows break the pattern entirely: there's no POSIX mode on the client side to propagate, so Samba writes fresh mode bits from its server-side create_mask (QUT's hpc-fs has this configured to open group rw).
Decide your intent
One question decides everything: will your collaborators write to these files?
| Answer | Layers you need | Right workflow |
|---|---|---|
| Yes — shared-edit (group reads + writes + deletes) | 1 + 2 (rw) + 3 |
§ Shared-edit transfers |
| No — read-only (group reads only) | 1 + 2 (r--); skip 3 |
§ Read-only sharing |
Already inside /work/<group> |
All three already set | § Moving within /work/<group> |
Pick before you transfer. Most "I just moved stuff and my collaborators can't edit it" trouble comes from solving the wrong subset of layers.
Shared-edit transfers
Pattern: create + chmod (Linux) or drag + drop (Windows / macOS SMB). Create lands you layers 1 + 3 for free; the transfer method decides whether layer 2 needs your attention.
Linux: skip the chmod step — set your umask, or use rsync --chmod
Layer 2 needs chmod after Linux transfers only because your umask defaults to 0022, which produces mode 0644 files (group r--). Change the umask up front and layer 2 lands correctly on /work/<group>/ without any post-transfer step.
Recommended — umask 0007 in ~/.bashrc (or ~/.zshrc):
New files land at mode 0660 (rw-rw----); new dirs at 0770 (rwxrwx---). On /work/<group>/, effective group access is rw- (or rwx on dirs) — shared-edit-ready with no chmod.
Why 0007 over the alternatives: strictly tighter than the system default. Default umask 0022 leaves your ~/ files world-readable at mode 0644; umask 0007 closes off world access on ALL new files (including ~/) while opening group rw. On Aqua's default per-user private groups (your default group contains only you), opening group rw on ~/ is harmless. Net: your ~/ gets stricter than default, AND /work/<group>/ shared-edit just works.
Alternative — umask 0002: same effect on /work/<group>/ shared-edit, but keeps ~/ files at mode 0664 — world-readable (same posture as system default, just adds group write). Pick this if you want minimal behavioral change from the default and don't care about the ~/ world-readable exposure.
Per-command alternative — rsync --chmod: no shell rc change; override source mode bits at transfer time.
Alias it in ~/.bashrc if you use it often.
Empirical outcomes on /work/<group> (same cp command, different umask or override):
| Method | Resulting mode | Mask | Effective group |
|---|---|---|---|
cp with umask 0022 (system default) |
-rw-r-----+ |
r-- |
r-- — chmod needed |
cp with umask 0002 |
-rw-rw----+ |
rw- |
rw- ✓ |
cp with umask 0007 |
-rw-rw----+ |
rw- |
rw- ✓ + no other access |
rsync --chmod=Dg+rwX,Fg+rw,o-rwx |
-rw-rw----+ (files); drwxrws---+ (dirs) |
rw- (files); rwx (dirs) |
rw- / rwx ✓ |
Caveats:
- Only affects newly-created files. Files already in
~/at restrictive mode still land at that mode if youmvthem in — umask does not touch renames. - Both umasks affect ALL new files everywhere, not just
/work/<group>/. On Aqua's default per-user private groups, this is harmless. - Check your current umask with
umask(from a login shell) before deciding whether to change it.
GROUP=your-group-name # (1)!
cp ~/script.py "/work/$GROUP/project/" # (2)!
chmod g+rw,o-rwx "/work/$GROUP/project/script.py" # (3)!
# Executable script? Use `chmod 770` instead.
- Replace with your actual group name.
cpcreates a new file → layers 1 + 3 inherited → group=<group>, ACL entry present.- Open layer 2 group bits.
o-rwxkeeps the file group-private.
GROUP=your-group-name
SRC=~/project_folder
DST="/work/$GROUP/project_folder"
mkdir "$DST" # (1)!
rsync -rlt --no-owner --no-group --no-perms "$SRC"/ "$DST"/ # (2)!
chmod -R g+rwX,o-rwx "$DST" # (3)!
# Verify content matches (empty output = identical)
rsync -rltni --no-owner --no-group --no-perms "$SRC"/ "$DST"/ # (4)!
# Once verified, drop the source
rm -rf "$SRC"
- Fresh directory inside
/work/<group>→ inherits setgid + default ACLs → layers 1 + 3 done. - Copy contents.
-rltrecurses + preserves symlinks + mtime.--no-perms+ the--no-*flags propagate source mode bits without source group/owner — layers 1 + 3 stay inherited per file. - Required with default umask. Opens layer 2 group bits across the tree —
--no-permspropagated source mode bits which are usually too restrictive. CapitalXadds exec only to dirs + already-exec files (preserves scripts, leaves data files non-exec). Skip this step if you already setumask 0007(see the tip at the top of this section). -n= dry-run;-i= itemize. Verifies content match, not perms.
Mount \\hpc-fs\work as a network drive in Windows Explorer (VPN if off-campus, qutad\<username> credentials — see the QUT eResearch — Transferring files page1). Drag files or folders into \\hpc-fs\work\<group>\.
That's it. No chmod needed for the shared-edit case — Samba's server-side create_mask on hpc-fs fills layer 2 correctly (see the transfer-method matrix).
Optional verify from an Aqua shell:
Expect: # group: <group>, mask::rwx, default:group:<group>:rwx (present if it's a folder). Effective group access should be rw- or rwx, never r-- or ---.
Scripts drop owner-exec
Windows Explorer via SMB leaves scripts (.sh, .py) at mode 670 (-rw-rwx---): group can execute, but owner cannot. If you want to run your own script from an Aqua shell, run chmod u+x /work/<group>/<your-script> afterward. Samba-specific — scripts moved via the Linux tabs stay owner-executable.
CRLF line endings
Text files edited with Notepad or other Windows editors may carry CRLF line endings that break shell scripts on Aqua. Fix with dos2unix <filename> on the Aqua side, or configure your editor to save with LF.
In Finder: Go → Connect to Server, enter smb://hpc-fs/work/ (VPN if off-campus). Authenticate with your QUT username + password. Navigate to /work/<group>/ and drag files or folders.
Layer results are identical to Windows Explorer — three layers land correctly, no chmod needed for shared-edit.
Finder emits ._filename sidecars for xattr storage
Finder writes an AppleDouble sidecar (._<original-filename>, ~4 KB) whenever macOS needs to preserve extended attributes on a file — the shared filesystem doesn't natively store macOS xattrs, so AppleDouble is the fallback. This fires on Finder copy/move (files typically arrive carrying Gatekeeper com.apple.quarantine markers, resource-fork xattrs, or Finder tags), and can fire during passive Finder operations that touch metadata (tagging, icon-info viewing, Spotlight indexing). At any real dataset scale that's one sidecar per file — doubled inode count and cluttered ls / find / du / rsync output for every collaborator downstream.
Recommended alternatives (both avoid ._ sidecars entirely):
- Cyberduck / Transmit — SFTP-based GUI clients, drop-in Finder-workflow replacements.
- Terminal
rsync -e ssh <src>/ <your-username>@aqua.qut.edu.au:/work/<group>/— cleanest for repeatable transfers.
If you already copied via Finder, sweep the sidecars
# Preview what would be deleted (dry run):
find /work/<group>/<path> -name '._*' -print
# Delete once you're happy with the preview:
find /work/<group>/<path> -name '._*' -delete
On macOS: dot_clean -m /Volumes/work/<group>/<path> also works if the share is still mounted.
.DS_Store behavior is inconsistent
.DS_Store files are NOT blocked by Samba on hpc-fs, so Finder can drop them at any point. Prevent future ones by running this on your Mac (once):
Sweep any that already landed:
Why these rsync flags and not -a?
-a (archive mode) expands to -rlptgoD. The p (perms), g (group), and o (owner) flags preserve source metadata — which keeps your default group on the destination, breaking layer 1.
| Flag | What it does | Safe for ~/ → /work/<group>/? |
|---|---|---|
-r |
Recurse into directories | ✓ |
-l |
Preserve symlinks as symlinks | ✓ |
-t |
Preserve modification times | ✓ |
--no-perms |
Destination uses source-mode + umask, not source's exact mode bits | ✓ — needs the follow-up chmod to open layer 2 |
--no-owner |
Don't copy source owner | ✓ — chown across users needs root anyway |
--no-group |
Don't copy source group | ✓ — destination inherits layer 1 via setgid |
-p (in -a) |
Preserve source mode bits | ✗ — locks layer 2 to source's bits |
-g (in -a) |
Preserve source group | ✗ — breaks layer 1 |
-o (in -a) |
Preserve source owner | ✗ — would fail anyway, but noisy |
Linux methods that LOOK right but fail at one or more layers
| Command | Layer 1 (group) | Layer 2 (mode) | Layer 3 (ACL) |
|---|---|---|---|
mv ~/dir /work/$GROUP/ |
✗ default | ✗ source's | ✗ none |
cp -a ~/dir /work/$GROUP/ |
✗ default | ✗ source's | partial (setgid bit only) |
cp -p ~/dir /work/$GROUP/ |
✗ default | ✗ source's | ✗ none |
rsync -a ~/dir/ /work/$GROUP/dir/ |
✗ default | ✗ source's | ✓ inherited (but mask = ---) |
Each preserves source metadata at the cost of layer 1 (group). rsync -a paradoxically gets layer 3 right via inheritance but still locks collaborators out via layer 2. Windows Explorer and macOS Finder via SMB don't appear here — different mechanism (Samba create_mask), different failure modes (see the transfer-method matrix and the Windows/Finder tabs above).
What the modes look like after chmod -R g+rwX,o-rwx
Verified live against /work/<group>:
| Source | Mode after chmod -R g+rwX,o-rwx |
What it gives the group |
|---|---|---|
| Directory (any starting mode) | drwxrws---+ mask=rwx |
rwx — cd, list, create, delete |
Data file -rw------- |
-rw-rw----+ mask=rw- |
rw- — read + write, no exec |
Script -rwx------ |
-rwxrwx---+ mask=rwx |
rwx — exec preserved |
| NEW file/dir created later | -rw-rw----+ / drwxrws---+ |
inheritance keeps firing |
Read-only sharing
Different goal: collaborators read, you write. Layers 1 + 2 are enough — you don't need layer 3 because you're not setting up an ongoing area where new entries appear.
GROUP=your-group-name
mv ~/project_folder "/work/$GROUP/" # (1)!
chgrp -R "$GROUP" "/work/$GROUP/project_folder" # (2)!
chmod -R g+rX,o-rwx "/work/$GROUP/project_folder" # (3)!
mvis fine here — fastest move (rename, no copy), and we're about to fix layers 1 + 2 explicitly anyway.- Fix layer 1 (group identity).
- Fix layer 2 for read-only. Capital
X(notx) gives traverse for dirs + exec for already-exec scripts; lowercasexwould falsely mark data files executable.
Already copied via Explorer or Finder as shared-edit?
Dial back to read-only from an Aqua shell without re-transferring:
Removes group write while keeping group read + traverse. Default ACL entries stay in place (shadowed by the mode-bit mask).
When this stops working
Any file you ADD LATER won't auto-inherit (no layer 3 / default ACL). You'll need to re-run chgrp + chmod each time, or graduate to the § Shared-edit workflow. Use this pattern for one-time publish-style sharing — results snapshots, archive drops, things you won't touch again.
Moving within /work/<group>
Plain mv is correct here. Source already has all three layers — nothing to break. The trap only fires when you cross from outside /work/<group> into it.
If you got it wrong
No matter how the wrong perms got there — Linux mv from ~/, rsync -a, or a Windows-dropped script missing owner-exec — the fix runs Linux-side. Pick by intent.
GROUP=your-group-name
DST="/work/$GROUP/the_moved_thing"
chgrp -R "$GROUP" "$DST" # (1)!
find "$DST" -type d -exec chmod 2770 {} \; # (2)!
find "$DST" -type f -exec chmod g+rwX,o-rwx {} \; # (3)!
setfacl -R -m g:"$GROUP":rwx "$DST" # (4)!
setfacl -Rd -m g:"$GROUP":rwx "$DST" # (5)!
- Layer 1 — fix group identity.
- Layer 2 for dirs —
2770= setgid bit + group rwx + no other access. - Layer 2 for files —
g+rwopens group write; capitalX(notx) conditionally adds group exec only to files that already had exec set, so scripts stay executable and data files don't get falsely marked exec;o-rwxstrips other access. - Layer 3 current ACL — applies to entries that exist now.
- Layer 3 default ACL — applies to entries created later, so
DSTkeeps behaving correctly going forward.
Verified: after the full fix, new entries created inside DST inherit layers 1 + 3 automatically — DST is now configured the same way as /work/<group>/ itself.
Single-line fix — the file already has correct layers 1 + 3 and group-exec; only owner-exec needs opening.
See the Windows Explorer tab under Shared-edit for why Samba drops this specific bit.
Ownership transfer needs a re-create
chgrp to a group you're in works fine. chown to a different user requires root — even if a colleague gave you the files, you can't take ownership directly. To "transfer" ownership, copy the tree into a fresh destination you create as yourself (§ Shared-edit directory workflow). The copy's new inodes will be owned by you.
What QUT eResearch documents (and doesn't)
- The Filesystem and data management page1 says new entries in
/work/inherit parent permissions. True for layers 1 + 3; false for layer 2. Mode bits come from whatever the transfer method supplies (source mode bits for Linuxcp/rsync; Samba'screate_maskfor Windows Explorer or macOS Finder). The page doesn't define create-vs-move, doesn't mention setgid or default ACLs, and doesn't warn aboutmv. - The Transferring files page1 documents
rsync -aas the recommended flag set. Fine for/home↔/home; for~/→/work/<group>/shared-edit,-apreserves yourdefaultgroup and breaks layer 1. Use the Linux Directory workflow instead. - The same page shows
\\hpc-fs\<username>for Windows home andsmb://hpc-fs/work/for macOS/work, but doesn't spell out\\hpc-fs\workfor Windows or describe Samba'screate_maskbehavior on the server side. This page fills that gap: the Windows Explorer and Finder tabs are the tested + documented SMB paths. - New shared folder requests go through the eResearch Help Centre portal (
HPC request→New shared folder).
Where next
- Lesson 2 — Tooling Setup —
/homevs/scratchplacement - Know Your Nodes — Storage internals — Aqua filesystem capacity picture
- QUT eResearch — Filesystem and data management1
- QUT eResearch — Transferring files to/from HPC1
- Linux refs:
acl(5),getfacl(1),setfacl(1),chmod(1)