/var/opt/gitlab/backups
我有一个具有以下权限的目录:
[user@localhost ~]$ sudo ls -la /var/opt/gitlab/backups
total 1316296
drwx------. 2 git root 63 1月 21 21:44 .
drwxr-xr-x. 21 root root 4096 1月 21 21:39 ..
-rw-------. 1 git git 1347880960 1月 21 21:44 1642819457_2022_01_21_14.1.2-ee_gitlab_backup.tar
现在以下命令不会删除任何内容
sudo rm -rf /var/opt/gitlab/backups/*
虽然以下命令会删除目录及其中的所有内容
sudo rm -rf /var/opt/gitlab/backups/
另外,以下命令将删除特定文件
sudo rm -rf /var/opt/gitlab/backups/1642819457_2022_01_21_14.1.2-ee_gitlab_backup.tar
只是文件通配符方式不起作用(不幸的是这正是我想要的)
但是我想要的只是删除里面的文件而不删除目录。我怀疑这是因为权限设置,但更改权限对我来说不是一个选择。目录所有者和权限是由第三方软件自动设置的,我不想乱搞。
有没有办法达到“删除目录内所有文件但不删除目录本身”的效果?
答案1
通配符由您的 shell 扩展。为了
rm /var/opt/gitlab/backups/*
要工作,那么您必须拥有列出 的内容的权限/var/opt/gitlab/backups/
。例如,考虑作为非 root 用户运行以下命令:
$ echo /var/*
/var/cache /var/db /var/empty /var/lib /var/lock /var/log /var/mail /var/run /var/spool /var/svc.d /var/tmp
然后 shell 将 展开*
到该目录中的非隐藏文件列表,然后echo
打印这些值。
但是,如果我尝试对我无法访问的目录执行相同的操作:
$ echo /root/*
/root/*
shell 没有枚举内容的权限,因此无法扩展*
.
如果你确实必须使用通配符,那么你可以尝试:
$ sudo /bin/sh -c 'rm -rf /var/opt/gitlab/backups/*'
这样,您就可以/bin/sh
以 root 身份运行一个新的 shell ( )。该 shell 将有权读取该目录的内容并可以扩展*
到该内容。