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


27

違いは何ですか:

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

回答:


41

findutils findマンページから:

式が指定されていない場合は、式-printが使用されます(ただし、おそらく-print0代わりに使用することを検討する必要があります)。

-printfind式です。)

POSIXのドキュメントには、この確認されます。

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

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

-printが行われるかの説明は、マンページのさらに下にあります。

-print

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


初心者レベルの質問ですが、あなたが話しているこの表現は何ですか?これは正規表現ですか?
リシプラカシュ

2
@Rishiのマンページを参照してください。
スティーブンキット

20

-printデフォルトアクションです。一部のfind述部は、フィルターまたは条件とは対照的に、アクションと見なされます。たとえば、アクションではありません。条件として使用することもできますが、アクションです。-type f-exec

アクションには-print-execおよびが含まれます-ok。いくつかのfind実装では、のような他の非標準アクション述語を持って-print0-printf-execdir-okdir-ls...

find files <some-predicates>

包含アクションのいずれも次のものと同等で<some-predicates>はない場合:

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)を前提としてい$fileの名前ではありませんfind(最初の場合またはオプション)述語。

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


それが非標準であり、避けることが最善である場合、なぜそれを命名するのですか?
アイザック

@Isaac、彼らは便利ですので、/ ...可能タイプミスです
vonbrand


4

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


3
それは、AIXの非常に古いバージョンになります。AIX 4.3 findでは必要ありません。AIXは何十年もPOSIXに準拠しています。
ステファンシャゼル

3

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

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


1

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

find . -print -delete

に似ています

rm -rfv *

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

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

shopt -s dotglob

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

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