サニーは上記の質問に答えました。この投稿、答えは次のように与えられます
スクリプトは必要ありません。
//目次:
find . -type d -exec chmod XXX {} \;
//ドキュメント:
find . -type f -exec chmod XXX {} \;
素人の言葉で説明できますか?
{}
私は説明できないマークが本当に好きではなく、\
気にしません;
!
私はLinux cli / bash / shellなどを学び、インターネット検索などで答えを見つけようとしてきましたが、上記の状況が発生しない限りほとんどうまくいきます。
答え1
{}
一致するファイルが見つかったことを示すプレースホルダーです。これは、一致するファイルが見つかったexecパラメータに渡されたコマンドを通知する方法です。
;
Execパラメータで使用されているコマンドを終了します。実行シェルから解析されないように\
エスケープするためのものです(通常、順次実行される複数のコマンドを分離するために使用されます)。他の方法で簡単に参照できます。;
;
find . -type d -exec chmod XXX '{} ;'
find . -type f -exec chmod XXX '{} ;'
;代わりに+を使用することもできます。これにより、findは各一致をリストに追加し、それらをすべて子プロセスに渡します(各一致のexec引数でコマンドを実行するために新しい子プロセスを作成する代わりに)。 (注:一致する項目が多い場合は+を使用すると、コマンドが長すぎるというエラーが発生する可能性があります。)
find . -type d -exec chmod XXX {} +
find . -type f -exec chmod XXX {} +
答え2
.
=現在のディレクトリ、つまり。現在のディレクトリとその下のディレクトリを検索します。ホームディレクトリを検索するには、を使用します/home
。ホームディレクトリを検索するには、を使用します~/
。ユーザー "foo"のディレクトリを検索するには、~foo/
.findを使用します。すべてルートから下へ/
。
気づく! :アクセスを求めます!ディレクトリ(たとえば、他のユーザーのホームディレクトリ)にアクセスする権限がないと、これもfind
できません。これ根-ユーザーにはそんな愚かな制限はないが、「大きな力には大きな責任が続く」。
-type d|f
=find は、特定の「タイプ」のファイルを検索するように指示します。ファイル、ディレクトリ、ソケット、シンボリックリンク、名前付きパイプ… Aは、f
探しているタイプがファイルであることを指定し、aはディレクトリを返そうとするd
ことを指定します。find
通常、見つかったfind
ファイルのみが一覧表示され、これは暗黙の-print
ディレクティブです。しかし、ここでは、findがchmod
見つけたファイル/ディレクトリに対してコマンドを実行したいと思います(ここ)。これには-exec
orディレクティブを使用できます-ok
。 -ok
コマンドを実行する前に、まず「はい」または「いいえ」の入力を求められます。
実行されるコマンドは、コマンドの直後に始まり(セミコロン)が表示される-exec
まで続きます。残念ながら、セミコロンはシェル(およびその他)に特別な意味もあります。シェルはそれを使用してコマンドを1行にグループ化します(例:)。したがって、シェルが以前にセミコロンを「引用」しないように、セミコロンを「引用」する必要があります。シェルは3つの形式の引用を受け入れます。二重引用符(「...」)と一重引用符(「...」)は通常、文字列に使用されます。これらのいずれかを使用してセミコロンを引用することができます。ただし、ここで示すように単一文字のみを引用したい場合は、3番目の引用符であるバックスラッシュ(\)を使用する方が一般的です。結果は。find
;
bash
command1 ; command2
find
\;
find
\;
;
通常、私たちが実行したいコマンドは find
ファイル名を見つける必要があります。見つかったファイル名のプレースホルダとして使用されます。通常、コマンドがスペースを含むファイル名を単一のファイル名として扱うように、プレースホルダを引用符で囲むことをお勧めします。find
{}
"{}"
私が見つけたchmod u=rw,go=r {}
、または最もうまく機能するファイルの場合は、ディレクトリの場合、または(編集の程度に応じて)をchmod u=rw,go= {}
使用する必要があります。chmod u=rwx,go=rx {}
chmod u=rwx,go= {}
答え3
私は説明できない{}と\タグが本当に好きではなく、それも気にしません。
または、{}と\;があまりにも多くの問題である場合は、代替手段があります。また、この方法はfind ... -exec公式よりもファイル名のスペースをよりよく処理します。
find . -type d -print0 | xargs -0 chmod MASK
find . -type f -print0 | xargs -0 chmod MASK
find コマンドの -print0 は null で終わる文字列のリストを生成します。 xargs はリストを処理します。 -0 は null で終わる文字列に分割する必要があることを意味します。
また、場合によっては、この式はfindコマンドの-execパラメーターよりも高速です。以下はいくつかの議論です。https://stackoverflow.com/questions/896808/find-exec-cmd-vs-xargs
-print0は通常、UnixではなくLinuxでのみ機能できます。
答え4
簡単に紹介するには\;
:
\;
コマンドの区切り文字は、見つかったファイルごとに新しいプロセスを開始します-exec
。find
それでは、100,000個のファイルを含むディレクトリツリーでこれを実行すると想像してみてください。
一度に/many/ファイルを処理できるようなコマンドを実行すると、chmod XXX ...
パフォーマンスが向上します。
find <base> <conditions> -exec chmod xxx {} +
+
より大きなコマンドラインを構築して開始する必要があるプロセスの数を大幅に減らしましょう。しかもそれは必要ありません\
:-)