sudo rm -rf目录/*不适用于某些权限设置

sudo rm -rf目录/*不适用于某些权限设置

/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 将有权读取该目录的内容并可以扩展*到该内容。

相关内容