사용자 정의 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-
find
find
, -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 * ...
이것은 당신이 사용하고 싶은 것이 아닙니다.