「find」の書き込み可能および読み取り可能テストが利用できない場合、どのように表現しますか?

「find」の書き込み可能および読み取り可能テストが利用できない場合、どのように表現しますか?

時には、以前のLinuxシステムでは、ファイルまたはディレクトリの書き込み/読み取り可能性テストがサポートfindおよび-writableテストされていない状況に直面します。-readable現在のユーザーの場合。

たとえば、ユーザーが書き込み権限を持っているかどうかを所有者/グループごとにテストしないでください-writable。と表現することは同じではありません。-perm -0002

たとえば、別のテストでテストをどのように表現しますかfind-writablefind-perm

ベストアンサー1

便利な方法はありません。これがGNUがアドインと-readable友達を見つける理由です。

ユーザーがメンバーに属するグループを列挙して、権限テストに似た式を作成できます。検証されていません。

can_access="( -user $(id -u) -perm -0${oct}00 -o ("
for g in $(id -G); do
  can_access="$can_access -group $g -o"
done
can_access="${can_access% -o} ) -perm -00${oct}0 -o -perm -000${oct} )"
find … $can_access -print

-rw----r--たとえば、アクセス制御リストが存在する場合やグループへのアクセス拒否などの極端な場合は、正しい結果が得られない場合があります。上記と同じ手法を使用して極端なケースを確認できますが、式はより複雑になります。アクセス制御リストの場合は、それをサポートするツールを呼び出す必要があります。

PerlやPythonなどの言語は、Perlから次の簡単なアクセスを提供しますaccess(2)findFile::Findそして-r-w//-x(Perlプロセスの有効なuidとgidを使用してください。//を使用して-R実際のuid / gidを確認して使用してください。-W-Xaccess(2)filetest 'access'その他の注意PerlがACLのような機能をサポートするのに古くない場合):

use File::Find;
use filetest 'access';
find(sub { if (-r $_) { print "$_ is readable\n"; } }, '.');

Pythonでは、次を使用します。os.walkそしてos.access(たとえば、Pythonプロセスの実際のuidとgidを使用しますaccess(2)。)

import os
for dirpath, dirnames, filenames in os.walk('.', ):
    for filename in filenames:
        filename = os.path.join(dirpath, filenames)
        if os.access(filename, os.R_OK):
            print(filename + ' is readable\n')

完全に信頼できる唯一の方法は、ファイルを開くことです。これには外部ユーティリティが必要なため、速度が遅くなります。一般ファイルの読みやすさをテストするには:

find … -exec sh -c 'exec 2>/dev/null; : <"$0"' {} \; …

書き込み可能性をテストするには、次のようにします: >>"$0"(これを行うと、追加するファイルが開きます。ファイルを書き込めない場合は失敗しますが、実際には何も変更せず、特に変更時間を更新しません)。ディレクトリの読みやすさをテストするには、を使用しますls -- "$0" >/dev/null。ディレクトリの実行可能性をテストするには、を使用しますcd -- "$0"。通常のファイル実行可能性、ディレクトリ書き込み可能性、またはほとんどの非伝統的なファイルへのアクセスの手動テストはありません。

おすすめ記事