web-dev-qa-db-ja.com

フォルダーに触れずにファイルから実行権限を再帰的に削除する方法は?

NTFSドライブにバックアップを作成しましたが、このバックアップは本当に必要であることがわかりました。ただし、NTFSドライブはアクセス許可をめちゃくちゃにしました。すべてのファイルを手動で修正せずに通常の状態に戻したいのですが。

1つの問題は、私のすべてのテキストファイルが突然実行権限を取得したことです。これは間違っています。だから私は試しました:

Sudo chmod -R a-x folder\ with\ restored\ backup/

しかし、ディレクトリからx権限も削除して読み取り不能にするため、これは誤りです。

この場合の正しいコマンドは何ですか?

48
gaazkam

すべてのフォルダの全員に実行権限を設定することに問題がない場合:

chmod -R -x+X *

-xは、すべての実行権限を削除します
+Xは、すべてに実行権限を追加しますが、ディレクトリにはonlyを追加します。

findを使用して、要求どおりにフォルダーを実際に操作しないソリューションについては、以下を参照してください。

74
Jak Gibb

さて、私はMac OS X、BSD、およびLinuxの「chmod」のマニュアルページを再度読み、いくつかの実験を行いました。ここでは、シンボリックモードについて学びました。複雑になる可能性がありますが、理解する価値があります。

  • 一般的な形式は [、…]です。ここで、
  • := [ugoa] [+-=] [rwxXstugo]
  • [ugoa](who)(複数指定)は、ユーザー、グループ、その他、またはすべての権限を設定することを意味します。指定しない場合、デフォルトは「a」ですが、 mask が有効です。
  • [+-=](action)(1つ指定してください)の意味:
    • +は、指定された権限をすでに有効な権限に追加することを意味します
    • -指定した権限をすでに有効な権限から削除します
    • =は、権限を指定された権限に設定し、他のすべてをクリアすることを意味します
  • [rwxXstugo](permission)(rwxXstの倍数を指定OR ugoの1つ)は、指定されたユーザーの権限を設定します(s)次のとおり:
    • r —読み取り
    • w —書き込む
    • x —実行/検索
    • X —実行/検索iffディレクトリーOR実行ビットはすでに設定されています。
    • s — suidまたはsgid
    • t — 粘着性がある
    • u —ユーザー権限をコピーする
    • g —グループ権限をコピーする
    • o —その他の許可をコピーする

したがって、たとえば、a+xは、誰でもファイルを実行できるようにします。 a+Xは、ファイルが誰でも実行可能であった場合に、誰でも実行可能にする。

a+xは、ディレクトリを誰でも検索できるようにします。 a+Xは、ディレクトリを誰でも検索できるようにします。

BSDとLinuxの主な違いは、BSDでは、ファイルの権限に基づいて決定が行われるということですbefore chmodが実行されました。 Linuxでは、+ X句が実行される直前に決定が行われます。

したがって、BSDの場合、a-x,a+Xの組み合わせは実行/検索権限を削除し、ディレクトリを全員が検索できるようにし、ファイルを全員が実行できるようにしますifそれはもともと誰でも実行可能でした。

Linuxでは、a-x,a+Xは実行/検索権限を削除してから、誰もが実行可能なファイルを残しながら、誰でもディレクトリを検索できるようにします。


具体的な例を次に示します。BSDマシンの場合:ディレクトリ、実行可能ファイル、および非実行可能ファイル:

drwxr-x---  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x---  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

ディレクトリと「fie」の両方がユーザーによって実行可能/検索可能であるが、他のユーザーは実行できないことを確認します。

次に、chmod a-x,a+X *を実行します。最初の句は、すべてのファイルのすべてのユーザーから実行/検索ビットを取り除きますが、2番目の句は、「fee」と「fie」の両方にそれを追加します。 「fee」はディレクトリであるため、「fie」は最初に実行可能なビットが少なくとも1つあるためです。

drwxr-x--x  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x--x  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

chmod -x+Xを実行しても同じ結果が得られました。

結論:Jak GibbのソリューションはLinuxでも機能しますが、BSDの場合、2つのパスを作成する必要があります。

私はこれをSVr4や他のUnixバリアントでテストしていません。

16
Edward Falk

それを行う1つの方法:

find backup -type f -exec chmod 0644 {} +
10
Satō Katsura
 find backup ! -type l ! -type d -exec chmod a-x {} +

タイプディレクトリ(要求どおり)またはシンボリックリンク(通常、シンボリックリンクは常にrwxrwxrwxであり、chmodが影響するそれらのシンボリックリンクのターゲット)。

ご了承ください:

 find backup -type f -exec chmod a-x {} +

regularファイルの権限のみを変更します。 directoriesおよびsymlinksだけでなく、devices名前付きパイプsocketsも除外されますシステムに応じてその他の可能性があります(OPのNTFSファイルシステムのバックアップの場合は、存在しない可能性があります)。

7

Zshでは、 glob qualifier.を使用して通常のファイル(シンボリックリンクを含まない)のみを照合し、Dを使用してドットファイルを照合します。

Sudo chmod a-x folder\ with\ restored\ backup/**/*(D.)

コマンドラインが長すぎる場合は、 zargs を使用できます。

zargs -- folder\ with\ restored\ backup/**/*(D.) -- Sudo chmod a-x