ls를 사용하는 대신 "find"를 사용하면 어떻게 작동하나요?

ls를 사용하는 대신 "find"를 사용하면 어떻게 작동하나요?

나는 다음 명령을 가지고 있습니다 :

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>

관련 정보