我试图进入chown
其中/opt
,但出于某种原因,chown
我跳到了父母面前,把所有东西都吃掉了。
有人能建议为什么/如何发生这种情况,以及如何避免将来发生这种情况吗?有点令人担忧的是,在给定目录中运行命令可以有效地跳转到根目录中运行它。
ubuntu: /opt > sudo chown -R root:www-data .*
chown: changing ownership of '../var/lib/lxcfs/proc/cpuinfo': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/proc/meminfo': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/proc/stat': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/proc/uptime': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/proc/diskstats': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/proc/swaps': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/proc': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/devices': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/blkio': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/hugetlb': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/rdma': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/pids': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/freezer': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/cpuset': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/memory': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/perf_event': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/cpu,cpuacct': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/net_cls,net_prio': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/name=systemd': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup/unified': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs/cgroup': Operation not permitted
chown: changing ownership of '../var/lib/lxcfs': No such file or directory
^C
:ubuntu: /opt >
答案1
不幸的是,在这种情况下,shell glob.*
匹配(父目录) :..
/
steeldriver@t400s:/opt$ ls .*
.:
..:
bin boot cdrom dev etc home initrd.img initrd.img.old lib lib32 lib64
libx32 lost+found media mnt opt proc root run sbin snap srv swapfile sys
tmp usr var vmlinuz vmlinuz.old
更多讨论请参见:
答案2
发生这种情况是因为您使用了:
sudo chown -R root:www-data .*
而你应该使用这个:
sudo chown -R root:www-data ./*
首先,-R
对目标目录下的所有目录进行递归。
此外,*
将匹配当前目录下的所有文件和目录。接下来,.*
将匹配所有文件和目录高一级当前目录。
为了避免将来出现这种情况,您可以ls
在执行命令之前使用该命令来验证路径chown
,如以下示例所示:
ls -a ./*
ls -a *
ls -a .*
ls -a ../*
避免这种情况的另一种方法是始终使用要运行命令的目录的完整路径。
以下是一个例子:
sudo chown -R root:www-data /opt/*
编辑:
chmod
您可以对所有隐藏文件或目录直接使用以下命令/opt
(假设使其隐藏的第一个字符.
是字母、数字、破折号或下划线,对于大多数文件来说都应该如此)。
for i in /opt/.[A-Za-z0-9-_]*; do sudo chmod root:www-data "/opt/$i"; done
您可以chmod
通过运行以下命令来验证这将包含哪些文件:
ls /opt/.[A-Za-z0-9-_]*
命令的第一部分:for i in /opt/.[A-Za-z0-9-_]*
表示对于所有结果全局 /opt/.[A-Za-z0-9-_]*
将每个结果分配给变量“i”。
这里的通配符表示第一个字符必须.
是下一个字符 [A-Za-z0-9-_]
必须是任意字符 AZ 或 az 或任意数字 0-9 或 a-
或 a _
。
这将排除代表当前目录以及当前目录上方的目录的结果.
和,并且仅包括隐藏文件和目录。..
命令的第二部分:do sudo chmod root:www-data "/opt/$i"
表示对与 的当前值匹配的所有变量运行该命令$i
。
命令的第三部分:done
说我已经完成了。
此外,您使用了-R
选项,chmod
并且该-R
选项是递归的,将应用于所有目录和文件。
当您仅使用chmod
不带选项的命令时,该命令将仅适用于您指定的特定文件或目录,而不会递归应用于目录。
答案3
你的麻烦是因为.*
比赛一切以点开头。上下文是当前目录,因为此表达式不包含路径。因此,如果.git
当前目录中有任何隐藏文件或文件夹,您将匹配它们。但是(正如您ls -a
在该文件夹中运行时所看到的),你还将.
匹配..
当然..
,是父目录,因此chmod -R
递归地针对父目录中的所有内容。