(ディレクトリではなく)ファイルから実行可能ビットを再帰的に削除する方法


73

USBスティック(FAT)をMacまたはUbuntuマシンに接続すると、すべてのファイルに実行可能ビットが設定されます。ディレクトリ構造をハードディスクにコピーした後、ファイルから実行可能ビットを再帰的に削除してディレクトリに保存するにはどうすればよいですか?


回答:


132

GNU chmod(Ubuntu上)の単一コマンドバリアント(現在のディレクトリから開始):

chmod -R -x+X .

説明:

  • -R -再帰的に操作する
  • -x -すべてのユーザーの実行可能フラグを削除する
  • +X -ディレクトリの場合、すべてのユーザーに実行可能フラグを設定します

この場合、Xすべての実行可能フラグがによってクリアされたため、大文字はディレクトリにのみ適用され-xます。それ以外の+X場合、フラグがユーザー、グループ、またはその他のいずれかに最初に設定されていた場合にも実行可能フラグを設定します。

BSD chmod(Mac OS Xにあります)では、2つのコマンドで個別に行う必要があります。

sudo chmod -R -x * && sudo chmod -R +X *

(メインディレクトリに隠しファイルも含めたい場合は、*を。(ポイント)に変更する必要がありますが、テストはされていません。)


Ubuntuの13.04でマイナーな微調整が必要である:chmod -R a-x+X *
エーロアールトネン

@EeroAaltonen:注をありがとう。これは、すべてのユーザーに許可を許可してumaskいない場合に発生する可能性がありますx。デフォルトを使用しますumaskか、それとも変更しましたか?umaskコマンドの出力を送信してください。:あなたのソリューションに加えて、この可能性もありますchmod -R a-x,+X *設定されますx、あなたに応じて許可がumask。答えを更新しますが、BSD / Mac OS Xの動作を最初に確認したいと思います。
パブーク

@paboukおっと!それは実際に私は0007.に自分のumaskを設定していたCentOSのボックスだった
エーロアールトネン

これは... :(私はただ悲しいようであるfindワン・シングまあを行う簡単なツールを組み合わせることのスタイルについては、以下の答えでバリアントを。
mikezter

2
これをすべてのファイルに適用する場合の.代わりに使用*します
ジョンマグノリア

46

最初に正しいパスにcdした場合:

find . -type f -exec chmod -x {} \;

または

chmod -x $(find . -type f)

findは、pathでタイプ 'f'(通常のファイルを意味する)のすべてのファイルを見つけます。そして、各ファイルでchmod -xを呼び出します。ファイル名と\;の代わりに{}が使用されます。chmodコマンドを終了します。


6
findサポートしている場合は、-exec ... \+代わりに使用-exec ... \;します—必要なfork+ execの数は少なくなります。そうでない場合は、を使用しますfind ... -print0 | xargs -0 ...
一時的な

5
私はこの手法を使用しましたが、検索に「-perm +111」が追加されたため、xビットが設定されているchmodのもののみfind . -type f -perm +111 -exec chmod -x {} \;
です。– chrish

4
+1 @Matthijsこれがpaboukのソリューションよりも優れている理由は、このコマンドがディレクトリをそのままにして、paboukがすべてのディレクトリの実行可能ビットを再設定するためです。実行可能ビットが設定されていないディレクトリがいくつかあり、paboukのコマンドで設定されますが、そのままにしておくこともできます。
MariusMatutiae

2番目のアプローチは、スペースを含むパスに対して失敗します。
メストレリオン

@ephemient:あなたの場合findの支持体は-print0、私はそれもサポートしますかなり確信している-exec
MestreLion

3

LinuxおよびUnixのターミナルウィンドウまたはMac OS Xでは、Terminal.appでこれを使用します。

find . -type f -print0 | xargs -0 chmod -x

1
これは本質的に、2011年のMatthijs Pの回答と変わりません。
slhck

このコマンドラインを覚えていますか?できません。
マイクL.

Matthijsの回答の下にあるephemientのコメントを参照して、この回答が役立つ理由を確認してください。
-PatrickT

2

このchmod -x+X方法はubuntuでもうまくいきませんでしたので、この最小限のPythonスクリプトを書きました:

#!/usr/bin/python3
import os
for par, dirs, files in os.walk('.'):
    for d in dirs:
        os.chmod(par + '/' + d, 0o755)
    for f in files:
        os.chmod(par + '/' + f, 0o644)

ファイルシステムにソケットなどの派手なものがある場合は、最後のchmodをtry / catchで囲むことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.