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

ワイルドカードはシェルによって拡張されます。 ~のため

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

その後、シェルは*そのディレクトリに隠されていないファイルのリストを展開し、echoその値を印刷します。

ただし、アクセスできないディレクトリに対して同じことをしようとすると、次のようになります。

$ echo /root/*
/root/*

シェルにはコンテンツを列挙する権限がないため、拡張できません*

本当にワイルドカードを使用する必要がある場合は、次のことを試すことができます。

$ sudo /bin/sh -c 'rm -rf /var/opt/gitlab/backups/*'

このようにして、/bin/sh新しいシェル()をrootとして実行できます。シェルはディレクトリの内容を読み取る権限を持ち、*ディレクトリに拡張できます。

関連情報