내 집의 첫 번째 수준에는 35개의 파일과 디렉터리가 있습니다(하위 디렉터리는 입력되지 않음). 그러나 결과는 "가짜"이며 .
특수 디렉토리를 포함하고 있기 때문에 36을 보고합니다. "."을 제외하는 방법은 무엇입니까?
스위치를 사용해봤지만 -not -path
작동하지 않습니다.
find . -not -path '*/\.*' -not -path /\. -maxdepth 1|wc -l
36
find $HOME -not -path '*/\.*' -maxdepth 1|wc -l
36
답변1
사용 -mindepth
:
find . -mindepth 1 -maxdepth 1 |wc -l
답변2
find
시작된 디렉터리를 포함하고, 원하는 결과를 얻으려면 수정하지 않고 출력에서 제외하세요.
find . -maxdepth 1 ! -path . | wc -l
find "$HOME" -maxdepth 1 ! -path "$HOME" | wc -l
$HOME
( 패턴 문자로 해석될 수 있는 문자가 포함되어 있지 않은 한 ,즉 *
, ?
, []
). 이름만 일치시키고 .
필요한 경우 관심 있는 경로에 추가할 수도 있습니다.
find . -maxdepth 1 ! -name . | wc -l
find "$HOME"/. -maxdepth 1 ! -name . | wc -l
발견된 파일 수를 정확하게 계산하려면 find
파일 이름(줄 바꿈 포함 가능) 이외의 다른 항목도 계산해야 합니다.예를 들어find
당신이 지원하는 경우 -printf
:
find . -maxdepth 1 ! -name . -printf 1 | wc -c
또는 POSIX의 경우 find
다음 //
트릭을 사용하십시오.
find .//. -maxdepth 1 ! -name . | grep -c //
..
문제는 아닙니다 . 명시적으로 추가하지 않는 한( ...) find
포함되지 않습니다 .find ..
ls
이는 기본적으로 .
표시 되지 않습니다. 숨겨진 파일을 보려면 및 및를 ..
보려면 대신 이 옵션을 사용하십시오 . GNU를 사용하면 특수 문자를 인용하도록 요청할 수 있으며 이를 통해 파일 수를 정확하게 계산할 수 있습니다..
..
-A
-a
ls
ls -q1A . | wc -l
답변3
! -path .
테스트를 수행하기 위한 경로 이름 은 find
사용한 검색 경로에 상대적이며 해당 디렉토리는 예제 명령에 표시됩니다 .
. 다른 검색 경로를 사용하는 경우 테스트에서 해당 경로를 사용하여 나열되지 않도록 합니다(예:)..
find
find "$HOME" ! -path "$HOME"
또한 를 사용하면 wc -l
실제로 파일 수를 계산하는 것이 아니라 생성된 줄 수를 계산합니다. find
이는 이름에 개행 문자가 포함된 경우 파일 수보다 많을 수 있습니다.
POSIX를 사용하면 find
다음을 사용할 수 있습니다.
find . ! -path . -prune -exec echo x \; | wc -l
현재 디렉터리에 있는 이름의 수를 셉니다. 여기에서는 모든 하위 디렉터리 입력이 -prune
중지되고 find
, 발견된 각 이름에 대해 한 줄에 한 문자가 출력됩니다 -exec echo x \;
. x
그런 다음 행이 계산됩니다 wc -l
.
.
표시되지 않거나 ..
가 있는 경우 대신 ls
사용하십시오 .ls -A
ls -a
단일 디렉터리에서 이름을 계산하는 또 다른 방법(가능한 모든 파일 이름 허용)은 다음과 같습니다.
shopt -s dotglob nullglob
set -- *
echo "$#"
... 에서 bash
, 또는
set -- *(DN)
echo $#
... zsh
( 숨겨진 이름과도 일치하도록 (DN)
동작을 수정하고 *
, 일치하는 항목이 없으면 활성화 dotglob
및 nullglob
셸 옵션 의 효과와 마찬가지로 패턴을 완전히 제거합니다 bash
).
두 코드 조각 모두 위치 매개변수를 숨겨진 이름을 포함하여 현재 디렉터리의 이름 목록으로 설정합니다. 이 작업이 완료되면 특수 변수에서 설정된 위치 매개변수의 수를 찾을 수 있습니다 $#
.
와일드카드 패턴은 *
match .
도 match도 아닙니다 ..
. 숨겨진 이름을 일치시키라는 요청을 받은 경우에도 마찬가지입니다.
yash
쉘 에서 숨겨진 이름과 일치 하도록 dot-glob
쉘 옵션을 설정하고,set -o dot-glob
*
포함하다따라서 .
이 셸을 사용하는 경우 ..
의 값에서 2를 빼야 할 수도 있습니다.$#
답변4
제일 쉬운. 일하다. 파일 이름에 줄 바꿈을 포함하는 대신에 아마도 그것은 끔찍한 표준이기 때문에 파일 이름을 바꾸라고 말하고 싶습니다.
ls -d * | wc -l