パスが指定されていない場合、find
結果が印刷されるのはなぜですか?./
$ find
./file1
./file2
./file3
印刷しないのはなぜですか?
$ find
file1
file2
file3
答え1
これ理由このメッセージが表示されるのはGNU開発者によるものです。find
選択済み「合理的な」行動の提供find
パスが指定されていない場合。対照的に、POSIXこのパラメーターがオプションであるという宣言はありません。
これ
find
ユーティリティはディレクトリ階層から繰り返しダウンしている必要があります。パスで指定された各ファイル、OPERANDSセクションで説明されている基本色で構成されるブール式は、見つかった各ファイルに対して評価されます。各パスオペランドは、末尾を含む提供されたとおりに評価する必要があります。<slash>
文字、階層で見つかった他のファイルへのすべてのパス名には、次のものを含める必要があります。従属現在のパスオペランド、<slash>
現在のパスオペランドが1で終わらない場合、ファイル名はパスオペランドに基づいています。関連部分には点または点 - 点コンポーネントを含めないでください。後続部分も含めてはいけません。文字、単一の文字<slash>
パス名コンポーネント間の文字です。
各プロファイルの違いを確認できます。 GNUは(慣例による)角括弧内の選択項目:
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...]
[expression]
そして、POSIXはオプションである可能性があることを示していません。
find [-H|-L] path... [operand_expression...]
GNUプログラムでは、これはftsfind.c
:
もし(板) { /* *いくつかのタスクが修正されるので、ここでは一時変数を使用します。 *一時的なパス。したがって、文字列定数を使用すると、 *コアダンプを取得します。最良の例は次のとおりです。 * "find -printf%H"(注、「find .-printf%H」ではありません)。 */ charデフォルトパス[2] = "."; return find(defaultPath); }
そして文字通りの意味"."
単純化のために使用されます。それから同じ結果を見るでしょう
find
そして
find .
(そしてPOSIXも同意する)道結果の前に付けるために使用されます(上記を参照)。従属)。
少し試してみると、この機能がいつ初めて追加されたかを確認できます。「findutils」は1996年に初めて作成されました。(望むよりfind.c
):
+ /* If no paths are given, default to ".". */
+ for (i = 1; i < argc && strchr ("-!(),", argv[i][0]) == NULL; i++)
+ process_top_path (argv[i]);
+ if (i == 1)
+ process_top_path (".");
+
+ exit (exit_status);
+}
find 3.8の変更ログでは、これは明らかに次のようになります。
Sat Dec 15 19:01:12 1990 David J. MacKenzie (djm at egypt)
* find.c (main), util.c (usage): Make directory args optional,
defaulting to "."
答え2
特に./
、ファイル名が-
.で始まる場合、後続のコマンドはそのファイル名をオプションとして解釈できます。 ./
このような状況は防止されます。
たとえば、次のファイルを含むディレクトリを考えてみましょう。
$ ls
--link --no-clobber
プレフィックスなしでファイル名が指定されたら、./
このコマンドがどのように機能するかを想像してください。
$ find -type f -exec cp -t ../ {} +
問題find
自体を使用して説明できます。上記のディレクトリで実行してみましょう。以下はうまくいきます:
$ find ./*
./--link
./--no-clobber
以下は失敗します。
$ find *
find: unknown predicate `--link'
Try 'find --help' for more information.
答え3
このfind
コマンドには検索パスが必要です。何も指定しないと、現在のディレクトリ(.
)を始点とした。同様に、例えばパスを渡すと、そのパスが/tmp
開始点として扱われます。結果も同じだ。
現在のディレクトリの場合:
$ find
or
$ find .
output:
./file1
./file2
./file3
ディレクトリの場合/tmp
:
$ find /tmp
output:
/tmp/file4
/tmp/file5
abc
ディレクトリが現在のディレクトリにある場合:
$ find abc
output:
abc/file6
abc/file7
現在のディレクトリの下に複数のディレクトリがある場合:
$ find fu bar
output:
fu/file10
fu/file11
bar/file8
bar/file9
答え4
パスを指定しない場合、find
コマンドは${PWD}
パスを想定して出力に出力します。ユーザーがパスを指定しなくても、find
作業方法は変わりません。デフォルトでは、検索は常にパスで機能します。