web-dev-qa-db-ja.com

UNIXのfindコマンドをマスターするにはどうすればよいですか?

私はfindの使用がかなり進んでいると思いますが、それを使用するたびに、-execオプションを閉じる方法を一生思い出せません。私はそれを使うたびに読書にかなりの時間を費やしています。私は単にそれを十分に使用していないのですか、それとも自分自身を期待しすぎているのですか?私を苛立たせる典型的な例から始めましょう。

ディレクトリ構造には、すべての不正な権限を持つファイルが含まれています。隠しファイルのシンボリックリンクなど。所有権を適切な値に変更したい

find . -type f -exec chown username {} \;
find . -type d -exec chown username {} \;
find . -type d -exec chgrp usergroup {} \;
find . -type f -exec chgrp usergroup {} \;

(エンディングが逆になっている場合はご容赦ください... 1時間前に見ましたが、それでもわかりません)

しかし、マウントやシンボリックリンクなどの理由で実行するのが怖いです。chmod。*の究極のグーフを作成し、以前に上向きに繰り返しました。 -xdevがパーティションの交差を放棄することは知っていますが、シンボリックリンクであるディレクトリ内にあるファイルがどうなるかはわかりません。

それで、重要なファイルを殺すことができるこの獣をどのようにマスターするのですか?

更新以下の最良の提案を整理して要約します:

  1. 練習用ディレクトリを他の練習用ディレクトリにリンクしてマウントします。
  2. 非直感的なexecコマンドではなく、xargsを使用します。
  3. 健全性と安全性のために-exececho {}を使用します
  4. セミコロンは特別であり、エスケープしているため、エスケープ文字が最初です
  5. -orコマンドは、選択基準を組み合わせるのに役立ちます。

私はprint0について少し混乱していますが、xargsは常に、私が避けようとしている一見したところ理解しにくい練習に少し取り組んできました。

11
ojblass

まあ、-exec構文に関する限り、多くの人のように、あきらめてxargsを使用できます。

find . -type f | xargs chown username

(または、スペース付きのファイルおよびその他の意味のない安全なバージョン)

find . -type f -print0 | xargs -0 chown username

または、セミコロンを使用して正しいことを思い出そうとするために、頭にドリルする必要があるのは、セミコロンを使用して終了-execが実行しているコマンドを実行することです。 、およびescapeセミコロンは、bashにとって特別な意味があるためです。それがバックスラッシュセミコロンである理由です。 {}置換部分は問題ないようです。

ファイルの削除などに関して、あなたが話しているような大きくて危険な何かを実行している場合、最初にこれを行ってください:

find . -type f -exec echo chown username {} \;

結果を確認します。これは基本的に「ドライラン」であり、許可すると実行されるコマンドが表示されます。間違いなく良い習慣です。 .*の問題には役立ちませんが、今はそうしないことを知っています。 :)

19
chaos

これはmanの目的です:物事を覚えるのは難しいかもしれません。そのため、* nixコマンドにはmanページが含まれています。構文に関するリマインダーについては、manページのACTIONセクションをいつでも確認できます。man find。マニュアルページは友好的ではないように見えるかもしれませんが、一度読むのが上手になると、とても便利です。

フロントエンドまたはラッパーを作成する:GNU find I write findのGUIフロントエンド python、glade、pygtkを使用してfindコマンドを生成します。これは、それを本当によく知りたい場合に適した演習です。

練習用のディレクトリを持っている:最後に、「エコー」のようなものがないときに強力なコマンドで遊ぶために、ホームディレクトリに「スクラップ」ディレクトリを常に持っていますtカットします。シェル拡張を使用すると、次のようなファイルをすばやく作成できます。

for i in {1..100}; do touch "$i"; done
3
Kyle Brandt

次のオプションについてまだ誰も言及していないことに驚いています。

find . -type f -ok chown username {} \;

この構文は、コマンドを実行する前に確認します。一致するファイルの数が比較的少ないと予想される場合は、ファイルごとにプロンプ​​トが表示されるため、最適に機能します。

いくつかの回答はxargsに言及していますが、GNUでも、これも不要であることがわかります。

find . -type f -exec chown username {} \+

+は通常エスケープする必要はありませんが、とにかくエスケープする習慣を身につけるのは良いことです。

3
Kamil Kisiel

検索式を「-and」および「-or」演算子と組み合わせることもできます。 -そして暗黙的です:

find . -type f -name "plainfile" ...

と同じです

find . -type f -and -name "plainfile" ...

Or演算子は、4つのコマンドのリストを2つに減らすことができます。

find . -type d -or -type f ...

そして最後に、findとは関係ありませんが、chownはグループを設定することもできます。したがって、名前のスペースにも対処すると、次のようになります。

find . -type d -or -type f -exec chown username:usergroup '{}' \;
1
Steve Folly

閉じるとき、私は使用することを考えます。多くのプログラミング言語のように、それをエスケープします。それは逃げる必要があることを覚えておいてください、そしてそれはあなたにかなり簡単にやって来ます。

0
Garry Harthill

使用しているfindのバージョンに応じて、役立つさまざまなオプションがあります。 GNU findはおそらく最も強力であり、これは2番目の(暗黙の)質問に役立つ可能性があります

たとえば、デフォルトの動作ではシンボリックリンクを逆参照しませんが、それをオーバーライドできます。 -mountオプションは、マウントポイントを通過する検索を停止します

お近くのmanページをご覧ください

0
Alec the Geek

一部のシェル(bashではない)では、適切な動作のために{}をエスケープします。

\{\} or '{}'

findマニュアルは、findを習得するのに適しています。

0
Ian Kelling

一部の人は argue xargsオプションが-execオプションよりも高速であることを示します。これは、各ファイルに対してコマンドを1回実行しないためですが、大量のジョブが非些細な時間。

個人的には、私は通常、execなしでfindを実行します

find /path/to/dir -name whatever

出力が正しく表示されていることを確認してから、そのリストでコマンドを実行します。

chown user:group `find /path/to/dir -name whatever`
0
theotherreceive

このようなことを行う前に、このコマンドを実行するディレクトリが/ usrまたは/ etcと同じファイルシステムにないことを確認してください。 (それ以外の場合、ホームディレクトリに/ etc/passwdまたは/ bin/shへのハードリンクがある場合は、それらの所有権を私に与えたばかりであり、副作用として、私は現在マシンを所有しています)。

ディレクトリを繰り返してすべてのファイル/ディレクトリをchownしたい場合は、簡単です。

chown -Rh user:usergroup user /

それを行います。 Make sure -hを使用するか、chownがシンボリックリンクをたどります。

0
chris