find 명령에서 점과 별표의 차이점

find 명령에서 점과 별표의 차이점

사용자 정의 Linux 운영 체제가 설치된 Synology NAS가 있습니다. 이 find명령을 사용하여 약 25일 동안 수정된 특정 디렉터리의 파일 목록을 나열해 보았습니다(일부 파일은 제외됨).

나중에 "." 대신 "*"를 사용하면 find결과가 다른 것 같습니다. 아래 명령을 참조하세요.

find . ! -path "*@eaDir*" -type f ! -iname ".DS_Store" ! -iname "Thumbs.db" -mtime -25

find * ! -path "*@eaDir*" -type f ! -iname ".DS_Store" ! -iname "Thumbs.db" -mtime -25

"."을 사용하면일부꽤 시간이 지난 후 출력됩니다. "."을 "*"로 바꾸면결과는 매우 빠르고 "."을 사용할 때와 다릅니다.

ls -al"*"를 사용한 결과가 올바른지, 즉 파일의 수정된 날짜/시간이 지난 25일 이내인지 확인한 적이 있습니다 .

결과가 왜 다른지 말해 줄 수 있는 사람이 있습니까?

답변1

존재하다:

find * ...

쉘 명령줄로서 *쉘에 의해 현재 디렉토리에 숨겨지지 않은 항목의 (어휘적으로 정렬된) 목록으로 확장된 glob입니다(일부 쉘의 경우 이는 *0 이상을 의미하는 패턴에서와 같이 유효한 문자만 포함하는 항목일 뿐입니다).수치).

따라서 현재 디렉터리에 다음 항목이 포함되어 있는 경우:

  • .
  • ..
  • .htaccess
  • file.txt
  • -foo-

findfind, -foo-, file.txt( 및 ) 매개변수를 사용하여 호출됩니다 .... 이것이 잘못된 옵션이나 술어 find라고 불평할 수 있습니다 .-foo-

다음을 사용하는 경우에도:

find -- * ...

-anything검색 중지 옵션(예: , ) 만 알려주고 술어는 알려주지 않기 때문에 or !또는 ...이라는 이름의 (파일에서는 제대로 작동하지 않습니다 .--find-L-H

당신이 사용할 수있는:

find ./* ...

문제를 방지하기 위해 숨겨진 파일을 무시하고 잘못된 문자나 인터럽트가 있는 파일을 무시할 수도 있습니다(사용인수 목록이 너무 깁니다.) 현재 디렉토리에 파일이 많은 경우.

그리고:

find . ...

.을 전달하면 현재 디렉토리 find가 됩니다 . .그런 다음 find쉘은 그 안에 있는 파일을 반복적으로 찾습니다(깊이 0의 파일, .및를 제외한 모든 항목(다른 숨겨진 항목 포함) 및 하위 디렉토리의 다른 모든 항목(여전히 및 제외)).......

당신은 단지 다음을 사용하고 싶습니다 :

find ./* ...

깊이 1(깊이 1만)의 파일 목록을 정렬하고 깊이 1(깊이 1만)의 숨겨진 파일을 제외하려는 경우. 그럴 것 같지 않습니다.

숨겨진 파일을 제외하려면 ! -name '.*'Or를 추가하세요(물론 잘못된 문자가 포함된 파일 이름에 주의하세요. 여기에는 패턴과 일치하는 최상위 디렉터리도 포함됩니다 -name '[!.]*').find .

각 수준에서 정렬하려면 zsh재귀 와일드카드에 glob 한정자를 사용해야 할 수도 있습니다.

다른 결과를 얻는 이유는 find *find 에서 먼저 현재 디렉터리의 첫 번째 파일이나 디렉터리를 찾으라는 지시를 받았기 때문일 가능성이 높습니다.알파벳 순서, 그리고 를 사용하여 자체를 살펴본 다음 다른 순서로 그 안에 있는 첫 번째 파일이나 디렉터리를 find .살펴봅니다 .(아마도 항목이 디렉터리에 저장된 순서일 수 있지만 일부 find구현에서는 디스크 헤드 검색을 최소화하기 위해 inode 번호별로 목록을 정렬하기도 합니다). ).

그런데 명령을 작성하는 더 좋은 방법은 다음과 같습니다.

find . \( -name @eaDir -o -iname .DS_Store -o -iname Thumbs.db \) \
  -prune -o -mtime -25 -type f -print

이는 find해당 디렉토리와 그 내용을 완전히 무시하는 것을 의미합니다(그 안을 들여다보려는 시도조차 하지 않음).

답변2

점은 현재 디렉터리를 나타냅니다. 일반적으로 로 사용됩니다 find.

순진한 별표는 쉘에 의해 확장됩니다앞으로 find현재 디렉터리의 내용을 실행합니다. 이것을 "와일드카드"라고 합니다. 효과를 보려면 다음을 수행하십시오.

echo *

의심할 바 없이 find * ...이것은 당신이 사용하고 싶은 것이 아닙니다.

관련 정보