나는 다음 명령을 가지고 있습니다 :
ls -Ra | grep -cve/ -e'^\.*$'
나도 같은 일을하고 싶다find
이것을 시도했지만 find . -name "^\.*$" -o -print | wc -l
문제는 다음과 같이 새 파일을 생성하면 touch "^.*$"
같은 방식으로 작동하지 않는다는 것입니다.
동일하게 작동하도록 변경하는 방법에 대한 아이디어가 있습니까?
답변1
질문
뭐하고 지내? 내가 이해할 수 있도록 명령을 설명해 보겠습니다.
ls -Ra | grep -cve/ -e'^\.*$'
당신에게 줄 것입니다 :
- 파일, 디렉토리, 심볼릭 링크 수...
- 현재 디렉터리 포함
- 이름이 점으로만 구성된 파일을 제외합니다.
touch '...'
(!!!)
해결책
당신이하고 싶다면정확히 똑같다를 사용하면 find
다음을 사용할 수 있습니다.
find . -not -regex '^\.+$' | wc -l
포인트가 2개 이상인 파일이 오류인 경우:
find . | wc -l
또는 (이론적으로) 다음 "ls" 방식을 사용하십시오. a
대문자를 사용하면 현재 디렉토리와 상위 디렉토리가 인쇄되지 않습니다.
ls -RA | grep -cve/ -e^\$
시간관리에 대한 몇 가지 조언
except multidots all files number of files
ls /home 0.75s 0.70s ~330000
find /home 0.50s 0.50s ~330000
ls / 2.50s 2.50s ~1350000
find / 1.90s 1.70s ~1350000
ls / [BSD] 10.00s 8.50s ~250000
find / [BSD] 7.50s 7.50s ~250000
보시다시피 조회는 거의 항상 더 빠릅니다.하지만 아직 최적화하지 않았습니다!
-f
정렬을 건너 뛰는 옵션을 추가하여 ls
처리 속도를 약 30% 높였습니다(결과적으로1.60초for )는 가장 빠른 명령 중 하나 /
입니다 . ls -RAf | grep -cve/ -e^\$
그러나 FreeBSD에는 아무런 영향을 미치지 않는 것 같습니다 ...
알아두면 좋은 점: BSD(이 경우 FreeBSD)에서 여러 지점을 확인할 때 극심한 시간 차이는 주로 다음과 같은 방식에서 비롯됩니다.GNU Grep이 작동하고 더 빠릅니다..
BSD와 Linux의 시간이 더 긴 것은 제가 테스트한 BSD 시스템이 훨씬 느리기 때문일 수도 있고, 다른 파일 시스템을 사용하기 때문일 수도 있습니다.
긴 이야기 짧게
표준 도구를 사용하여 디렉터리의 모든 파일 시스템 노드 수를 가져오는 Linux에서 가장 빠른 명령은 다음과 같습니다.
ls -RAf | grep -cve/ -e^\$
FreeBSD에서 더 빠른(실제로 질문에 대한 답변이기도 한) 더 짧은 명령은 다음과 같습니다.
find . | wc -l
답변2
차이점은 을 사용하면 -name
파일의 기본 이름만 일치한다는 것입니다. 에서 man find
:
-name pattern
Base of file name (the path with the leading directories
removed) matches shell pattern pattern. The metacharacters
(`*', `?', and `[]') match a `.' at the start of the base name
(this is a change in findutils-4.2.2; see section STANDARDS CON‐
FORMANCE below). <snip>
사용할 때 비슷한 동작을 얻으려면 다음을 ls -Ra
사용해야 합니다 -regex
.
-regex pattern
File name matches regular expression pattern. This is a match
on the whole path, not a search. <snip>