ls 또는 find를 사용하여 . 및 ..를 제외하는 방법은 무엇입니까?

ls 또는 find를 사용하여 . 및 ..를 제외하는 방법은 무엇입니까?

내 집의 첫 번째 수준에는 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-als

ls -q1A . | wc -l

답변3

! -path .테스트를 수행하기 위한 경로 이름 은 find사용한 검색 경로에 상대적이며 해당 디렉토리는 예제 명령에 표시됩니다 .. 다른 검색 경로를 사용하는 경우 테스트에서 해당 경로를 사용하여 나열되지 않도록 합니다(예:)..findfind "$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 -Als -a


단일 디렉터리에서 이름을 계산하는 또 다른 방법(가능한 모든 파일 이름 허용)은 다음과 같습니다.

shopt -s dotglob nullglob
set -- *
echo "$#"

... 에서 bash, 또는

set -- *(DN)
echo $#

... zsh( 숨겨진 이름과도 일치하도록 (DN)동작을 수정하고 *, 일치하는 항목이 없으면 활성화 dotglobnullglob셸 옵션 의 효과와 마찬가지로 패턴을 완전히 제거합니다 bash).

두 코드 조각 모두 위치 매개변수를 숨겨진 이름을 포함하여 현재 디렉터리의 이름 목록으로 설정합니다. 이 작업이 완료되면 특수 변수에서 설정된 위치 매개변수의 수를 찾을 수 있습니다 $#.

와일드카드 패턴은 *match .도 match도 아닙니다 ... 숨겨진 이름을 일치시키라는 요청을 받은 경우에도 마찬가지입니다.

yash쉘 에서 숨겨진 이름과 일치 하도록 dot-glob쉘 옵션을 설정하고,set -o dot-glob*포함하다따라서 .이 셸을 사용하는 경우 ..의 값에서 2를 빼야 할 수도 있습니다.$#

답변4

제일 쉬운. 일하다. 파일 이름에 줄 바꿈을 포함하는 대신에 아마도 그것은 끔찍한 표준이기 때문에 파일 이름을 바꾸라고 말하고 싶습니다.

ls -d * | wc -l

관련 정보