所有者(u)が1つのコマンドで削除できないr
ディレクトリ内のすべてのファイルを削除するように求められますw
。x
私は次のコマンドを試しました。
find data -type f ! -perm -u=rwx -exec rm -f {} \;
...しかし、あまりにも多くのファイルが削除されていると思います。
答え1
私考えるGNUを排他的に使用すると仮定すると、次のことが必要ですfind
。
find -type f \! -perm /u=rwx -exec echo rm -f {} \;
テストのために1つを追加しましたecho
。
印刷された文書が期待に応える場合は、その文書を削除してください。 :)
答え2
Linuxシステムを使用している場合は、GNUがある可能性が高く、find
他の答えの例に従ってくださいfind data -type f ! -perm /u=rwx -delete
。
find
Linuxシステムを使用していない場合は、述語パラメータの非標準構文を理解していないBSDシステム(macOSまたはオープンソースBSDのいずれか)を使用している可能性があります。この場合、各ファイルでを使用して、シンボル化されたユーザー権限を選択して文字列に対してテストできます(つまり、ユーザーにファイルに対する権限がないことを意味します)。/u
-perm
stat
---
find data -type f -exec sh -c '[ "$(stat -f %SHp "$1")" = --- ]' sh {} \; -print
これはstat
LinuxではなくBSDを想定していますstat
。このオプションは、出力を-f %SHp
そのファイルのstat
「高」(H
ユーザービット)表記法(S
)許可ビット()にフォーマットします。p
一般的なLinuxに対応する方法stat
は、シェルパターンを使用して-c %f
から?0??
シェルパターンと一致させることです。
実際にファイルを削除-print
するように変更できます。-delete
各ファイルに対して新しいシェルを起動しない少し効率的なバリエーション:
find data -type f -exec sh -c '
for pathname do
[ "$(stat -f %SHp "$pathname")" = --- ] && echo rm "$pathname"
done' sh {} +
削除はecho
ファイルを削除します。
答え3
免責事項:私はこの本の現在の著者です。生皮(右回転)(望むよりhttps://github.com/raforg/rawhide)
そして生皮(右回転)あなたはできます:
rh -UUU data 'f && !ur && !uw && !ux'
-UUU
一致を切断/削除/削除します。
data
検索パスです。
残りは検索基準だけです。
f
つまり、一般ファイルという意味です。
!ur
所有者が読み取る許可ビットが設定されていないことを示します。
!uw
所有者書き込み可能権限ビットが設定されていないことを示します。
!ux
所有者実行権限ビットが設定されていないことを意味します。
最後の3つの作業はより簡潔に行うことができますnone(0700)
。
rh -UUU data 'f && none(0700)'
もちろん、ユーザーが一致するファイルを含むディレクトリに対する書き込み権限を持っている場合にのみ、一致する項目を削除できます。これが問題の場合は、sudoを統合する必要があるかもしれません。
rh -x 'sudo rm %s' data 'f && !ur && !uw && !ux'
-x ...
一致するたびに指定されたシェルコマンドを実行します。
%s
一致するファイルパス(findなど{}
)に置き換えられます。
しかし、アクセス制御リストがある場合、この方法は機能しません。
ACLが存在し、確認されているすべてのファイルの所有者が現在のユーザーである場合は、access(2)
システムコールを使用してアクセス権を適切に確認できます。
GNU find
実際のアクセス確認を実行する、、があり、-readable
そのための、、があります。-writable
-executable
rh
ir
iw
ix
rh -UUU data 'f && !ir && !iw && !ix'
ただし、これは現在のユーザーがすべての関連ファイルの所有者である場合にのみ機能します。ファイルにACLと他の所有者がいる可能性がある場合、このaccess(2)
アプローチは役に立ちません。だから、このようなことがあなたに起こらないことを願っています。
答え4
そしてzsh
:
rm -- data/**/*(D.^rwx)