답변:
이유는 GNU의 개발자가 있기 때문에 당신이 볼 이유입니다 선택 에 대해 "합리적인"동작을 제공하는 경로가 지정되지 않은 경우입니다. 반대로 POSIX 는 매개 변수가 선택적이라는 것을 나타내지 않습니다.find
find
이
find
유틸리티는 path 에 의해 지정된 각 파일 에서 디렉토리 계층 구조를 재귀 적으로 내려 와서 발생하는 각 파일에 대해 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 defaultpath [2] = "."; return find (기본 경로); }
리터럴 "."
은 단순성을 위해 사용됩니다. 그래서 당신은 같은 결과를 볼 수 있습니다
find
과
find .
POSIX는 주어진 경로 가 결과의 접두사로 사용 되기 때문에 (그리고 연결에 대해서는 위를 참조하십시오 ).
약간의 작업으로 기능이 처음 추가 된 시점을 결정할 수 있습니다. 1996 년에 "findutils" 의 초기 작성에있었습니다 (참조 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);
+}
찾기 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 "."
일반적으로 파일의 사후 처리를 수행하므로이 경우 파일 이름을로 시작하면 큰 이점이 있습니다 ./
. 특히 파일 이름이로 시작 -
하면 후속 명령은 해당 파일 이름을 옵션으로 해석 할 수 있습니다. ./
그것을 피하십시오.
예를 들어, 다음 파일이있는 디렉토리를 고려하십시오.
$ 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.
file
수요 사용자는 (OS X의 BSD의 발견 등)의 경로를 제공합니다. 따라서 일반적으로 다음과 같이 명시 적으로 말해야합니다 find . -type f ...
. 거기에서 (GNU find와 같은) 일부 버전의 find는 기본값을 .
그대로두고 다른 모든 것을 그대로 둡니다.
find *
표시되지는 .
때문에 *
목록의 모든 파일과 폴더 만 제외 .
. 수행 echo *
하나 또는 두 개의 파일이 포함 된 디렉토리에, 당신은 볼 것이다 .
나열되지 않습니다. 따라서 find *
확장 된 각 파일 에서 작동합니다. find Desktop/
홈 디렉토리에서 말한 것과 같습니다 . 다음과 같이 출력됩니다 :Desktop/foo_bar.txt
find
방식으로 동작하는 이유를 설명합니다 . 이런 이유로find
이러한 방식으로 작동하도록 설계된 암시 적 주장을 뒷받침 할 신뢰 할만한
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
find
무엇이든 검색 할 경로가 필요하며 기본 디렉토리는 현재 디렉토리입니다. 문제는 왜 ./
때 file.txt
와 동일 할 때 선행을 인쇄 하는가 ./file.txt
입니다.
경로를 지정하지 않으면 find
명령은 경로를 경로로 가정 ${PWD}
하고 출력에 인쇄합니다. 경로를 지정하지 않은 사용자는 find
작동 방식을 변경하지 않습니다 . 찾기는 항상 기본적으로 경로와 함께 작동합니다.
/tmp
, 다음 $PWD
입니다 /tmp
없습니다 ./
.
/tmp
명령을 실행하십시오 find /tmp
. 경로를 지정하지 않으면 항상 현재 디렉토리가됩니다../
/tmp
. 그것이 될 수 없습니다 $PWD
.
${PWD}
는 잘못된 언어였습니다
find .
, find $PWD
그리고 find
(경로없이, 당신의 발견은 지원하는 경우).
find *
.