Linux

sudo rm -rf directory/* 不適用於某些權限設置

  • January 22, 2022

我有一個/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

只是文件萬用字元方式不起作用(不幸的是,這是我想要的)

但是我想要的只是刪除裡面的文件而不是刪除目錄。我懷疑這是因為權限設置,但更改權限不是我的選擇。目錄所有者和權限是由第三方軟體自動設置的,我不想亂來。

有什麼辦法可以實現“刪除目錄內的所有文件,但不刪除目錄本身”的效果?

萬用字元由您的外殼擴展。為了

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 ( )。該外殼將有權讀取目錄的內容,並可以擴展*到內容。

引用自:https://unix.stackexchange.com/questions/687407