所以我在重新操作系统后运行了这个启动脚本:
- 安装驱动程序
- 坐骑 Zpool
- 添加用户和 smb 用户以及 SMB 共享。
在新操作系统中唯一幸存下来的是我的 Zpool,其中大多数文件归 bob 所有,可以说,我的 docker 卷文件夹中的一些文件归 root 所有,因为敏感内容。
在我的脚本中,我使用了sudo chown -R
Zpool 中的所有文件,但我发现我不想这样做,因为根拥有的文件和目录。我希望保持所有权完整的 docker 卷。
所以我真正想要的是将我的示例“bob”用户拥有的文件的所有权从以前的状态更改为现在的状态,而不更改此特定文件夹中“root”拥有的文件。
- 我如何才能查看
chown
Zpool 中的所有文件并完全跳过其中的特定文件夹? chown
如果我的用户名在同一操作系统的新安装之间没有更改,我是否还需要所有文件?- 不同的操作系统怎么样?
多谢你们
答案1
sudo find /zpool -path /zpool/some/dir/to/exclude -prune -o \
-exec chown -h someuser:somegroup {} +
使用 GNU chown
,您还可以仅 chown 给定 user:group 拥有的文件:
sudo chown -Rh --from=user:group someuser:somegroup /zpool
(或者对于不考虑组--from=user
拥有的文件或对于不考虑用户拥有的组的文件)。user
--from=:group
group
标准等效项是:
sudo find /zpool -user user -group group \
-exec chown -h someuser:some group {} +
答案2
您可以在 find 中尝试 -prune 运算符:
听起来有点可怕,但它的作用是修剪 find 的处理
再次,如果您的文件位于 /zpool 中,这应该可以工作
find /zpool -user root -prune -o -exec chown user:group {} \;
这应该将所有不属于 root 的文件更改为由 user:group 拥有。只是为了确保您可以运行
find /zpool -user root -prune -o -exec echo {} ;\
查看是否获得了您期望的文件。
-o 是查找或运算符,在这种情况下,其工作原理为“如果前一个不匹配,则执行后续操作”
您问两个不同的问题,如果您想更改除 root 所拥有的内容之外的所有内容的所有者,则 find 命令应该可以工作。但是您还提到了除了给定子目录中的内容之外的所有内容,在这种情况下您将执行
查找 /zpool -name dir_with_secret_stuff -prune -o -exec chown user:group {} ;
文件上的用户名实际上并不连接到用户名,而是连接到数字用户 ID,因此,如果您的磁盘上包含名为 bob 的用户 1000 拥有的文件,则 ls -l 会将它们列为 bob 所有。如果您将该磁盘挂载在用户 1000 名为 nobob 的系统上,ls -l 会将它们列为 nobob 所有,如果您在没有用户 1000 的系统上 mnount 它,它们将仅显示为用户所有1000. 因此,如果您的用户名和用户 ID 保持不变,则相应的文件所有权将保持不变。
答案3
如果该文件夹可以位于目录层次结构中的任何位置,我认为您必须单独操作所有文件和目录。
假设您的 Zpool-thing 已安装,/zpool
并且您要排除的目录是/zpool/subdirectory/secret stuff
,那么也许这样的东西可以工作?
for item in "$(find /zpool -print | grep -v '/zpool/sudirectory/secret stuff')"; do
sudo chown user:group "$item"
done
当然,您可以用您想要使用的用户和组替换用户和组:-)
这find bin -print | grep -v '/zpool/sudirectory/secret stuff'
将为您提供“/zpool”中所有文件和文件夹的列表,“秘密内容”目录中的文件和文件夹除外,然后您只需 chown 列表中的所有项目即可。
关于用户名问题;重要的是用户 ID (UID)。检查与id
.如果 UID 没有改变,那就没问题了。