web-dev-qa-db-ja.com

findの違いは何ですか。見つけて 。 -印刷

違いは何ですか:

find .

そして

find . -print

-printは実際には何をしますか?

$ find .
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt
$ find . -print
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt
28
faressoft

findutilsfind manpage から:

式を指定しない場合、式-printが使用されます(とにかく、代わりに-print0の使用を検討する必要があります)。

-printfind式です。)

POSIXドキュメント はこれを確認します。

expressionが存在しない場合、--printが式として使用されます。

したがって、find .find . -printとまったく同じです。最初の式には式がないため、-printが内部的に追加されます。

-printの機能の説明は、マンページのさらに下にあります。

-print

真;完全なファイル名を標準出力に出力し、改行します。 findの出力を別のプログラムにパイプしていて、検索しているファイルに改行が含まれている可能性が最も低い場合は、-print0オプションの使用を真剣に検討する必要があります-printの代わりに。ファイル名の異常な文字がどのように処理されるかについては、UNUSUAL FILENAMESセクションを参照してください。

41
Stephen Kitt

-printがデフォルトactionです。一部のfind述語はfiltersまたはconditionsではなく、actionsと見なされます。たとえば、-type fはアクションではありません。 -execは、条件としても使用できますが、アクションです。

アクションには、-print-exec-okが含まれます。一部のfind実装には、-print0-printf-execdir-okdir-ls...などの非標準のアクション述語があります。

find files <some-predicates>

<some-predicates>のいずれも含まない場合actionsは以下と同等です。

find files \( <some-predicates> \) -print

(いくつかの-o演算子がある場合に重要な上記の括弧に注意してください)。

疑わしい場合は、-printを明示的に(または-exec printf '%s\0' {} +(または利用可能な場合は-print0)使用して、出力を後処理できるようにする)のが最善です。

デフォルトの-printアクションはPOSIXで指定されています。 一部の古いfind実装では、明示的な-print が必要でしたが、現在、一般的には使用されていません。

また、一部のfind実装ではfilesを省略できる場合があることに注意してください。この場合、デフォルトで現在のディレクトリを検索します。つまり、彼らにとって、

find

に相当

find .
find . -print

ただし、これは標準ではないため、回避するのが最善です。

スペクトルのより詳細な(そして便利な)終わりに、一部のfind実装では、次のように-fオプションの引数としてファイルパスを渡すこともできます。

find -f "$file1" -f "$file2" -print

これらは、findに任意のファイルパスを渡すことができる唯一のfind実装です。他の実装では、!-print...などのファイルパスを受け入れることができないため、find "$file" -print(またはfind -- "$file" -print)は、$filefind述語(または最初のケースのオプション)。

残念ながら、それも標準的でも移植性でもありません。

21

それらは同じで、どちらも現在のディレクトリからディレクトリ階層全体を書き出します。

POSIX find documentation から:

次のコマンドは同等です。

見つける。

見つける。 -印刷

8
cuonglm

Linuxでは違いはありませんが、他のシステム(AIXなど)では-printコマンドの出力を画面に表示する場合。

4
YoMismo

長年、findコマンドにはデフォルトのアクションがありませんでした。一般的なエラーは、-printオプションをfindコマンドに追加するのを忘れることでした。私は今でも癖からそれをタイプします。

しかし、ある時点でデフォルトのアクションとして追加されたので、今はfind .およびfind . -printは同等です。

3
Kevin

別のアクションを実行しているときに-printを明示的に使用すると、そのアクションが実行されたときにファイル名が表示される場合があります。

find . -print -delete

に似ているだろう

rm -rfv *

ここで、-print-vに対応します。 -printを含めない場合、ファイル名は表示されません。

ところで、rmコマンドをさらに類似させるために、最初にこのBashコマンドを発行します

shopt -s dotglob

これにより、*はドット(非表示)ファイルに一致します。