find 명령을 실행할 때 grep이 올바른 출력을 생성하지 않습니다.

find 명령을 실행할 때 grep이 올바른 출력을 생성하지 않습니다.

ls내 작업은 및 명령을 사용하지 않고 현재 디렉터리의 파일 수를 인쇄하는 것이었습니다 wc.

스크립트에 다음 줄을 입력했습니다.

#!/bin/bash
find . -maxdepth 1 -type f \( ! -iname ".*" \) > list3
grep .* -c list3 > /dev/tty

출력은 다음과 같습니다

..:0
.6.1c.sh.swp:1
list3:22

내 이해에 따르면 그것은 다음과 같아야 합니다:22

왜 작동하지 않습니까?

답변1

grep제대로 작동하지 않는 이유

grep그것이 .*당신이 찾고 있는 실제 패턴인지 말해야 하기 때문에 작동하지 않습니다 .

grep '.*' -c list3

작은따옴표를 사용하지 않으면 쉘은 .*디렉토리에 있는 모든 파일의 이름으로 확장됩니다. 이것은 ... 불리운다파일 이름 확장. 예를 들어 a.txt b.txt다음과 같이 grep표시됩니다.

grep a.txt b.txt -c list3

부터작은따옴표확장이 발생하지 않도록 하려면 이 방법을 사용합니다.


grep명령이 잘못된 곳 :

그런데 여기 패턴에서는 잘못된 방향으로 가고 있습니다. .정규식의 마침표가 일치합니다 .어느문자 그대로의 점이 아닌 문자입니다. 보다man페이지더 많은 정보를 위해서. 따라서 귀하의 정규식은 현재 "문자를 찾은 다음 문자의 시퀀스를 찾으십시오"라고 말합니다. 꽤 중복됩니다.

실제로 일치시키려는 경우:

[점] [다른 것]

... 점을 벗어나야 합니다.

\.*

find명령을 개선할 수 있는 부분 :

없애버리겠다는 게 무슨 말인지 모르겠어

\( ! -iname ".*" \)

귀하의 find명령은 모든 파일 앞에 현재 작업 디렉토리에 대한 점이 붙으므로 여기서는 아무것도 제거하지 않습니다. 방금 실행했을 수도 있습니다:

find . -maxdepth 1 -type f

답변2

원래 문제를 해결하려면 ls및 없이 파일 수를 계산합니다 wc.

순수 쉘 구문:

files=0
for i in *; do
    [ -f "${i}" ] && files=$((files+1))
done
echo ${files}

숨겨진 파일을 개수에 추가하려면 루프 이전에 globbing 설정을 변경하면 됩니다 for.

대안: 재미있는 find쉘 확장:

echo $(($(find -maxdepth 1 -type f -printf '+1')))

관련 정보