違いは何ですか:
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
findutils
find
manpage から:
式を指定しない場合、式
-print0
の使用を検討する必要があります)。
(-print
はfind
式です。)
POSIXドキュメント はこれを確認します。
expressionが存在しない場合、--printが式として使用されます。
したがって、find .
はfind . -print
とまったく同じです。最初の式には式がないため、-print
が内部的に追加されます。
-print
の機能の説明は、マンページのさらに下にあります。
真;完全なファイル名を標準出力に出力し、改行します。 findの出力を別のプログラムにパイプしていて、検索しているファイルに改行が含まれている可能性が最も低い場合は、
-print0
オプションの使用を真剣に検討する必要があります
-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
)は、$file
がfind
述語(または最初のケースのオプション)。
残念ながら、それも標準的でも移植性でもありません。
Linuxでは違いはありませんが、他のシステム(AIXなど)では-print
コマンドの出力を画面に表示する場合。
長年、findコマンドにはデフォルトのアクションがありませんでした。一般的なエラーは、-printオプションをfindコマンドに追加するのを忘れることでした。私は今でも癖からそれをタイプします。
しかし、ある時点でデフォルトのアクションとして追加されたので、今はfind .
およびfind . -print
は同等です。
別のアクションを実行しているときに-print
を明示的に使用すると、そのアクションが実行されたときにファイル名が表示される場合があります。
find . -print -delete
に似ているだろう
rm -rfv *
ここで、-print
は-v
に対応します。 -print
を含めない場合、ファイル名は表示されません。
ところで、rm
コマンドをさらに類似させるために、最初にこのBashコマンドを発行します
shopt -s dotglob
これにより、*
はドット(非表示)ファイルに一致します。