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')))