2014-06-11 2 views
0

이 코드 쉘 스크립트를 사용하여 디렉토리의 숨겨진 파일을 어떻게 계산합니까?

#!/bin/bash 

ls -l 
echo -n "Number of simple files : " 
ls -l | egrep '^-' | wc -l 
echo -n "Number of directories : " 
ls -l | egrep '^d' | wc -l 
echo -n "Number of hidden files : " 
ls -la | egrep '^.*\.$' | wc -l 
echo -n "Number of hidden directories : " 
ls -la | egrep '^d.*\.$' | wc -l 
echo " End" 

내가 처음 두 egrep을 작업 내가 어떻게 마지막 이 일을 알아낼 수있는 방법을 이해할 수 있지만

을 사용했다. 더 구체적으로는 '^.*\.$'의 의미는 무엇입니까? 로 시작하는 파일을 원합니다. (숨겨진 파일) 그리고 어떻게 정규 표현식을 형성해야합니까?

+0

이제 * 실제 * 질문이 숨겨진 파일 수를 계산하는 방법이 아니라 정규식'^. * \. $ '이 의미하는 바를 묻는 것이 좋습니다. –

+0

마지막 두 개가 작동하지 않습니다. 정규 파일과 디렉토리의 수를 각각 카운트하고 이름 * 끝 *을 마침표로 사용합니다. – chepner

+0

여기에있는 다른 사람들을 위해 freenode #bash 채널에서 관리하는 위키에 대한 링크가 있습니다 : [BashFAQ # 4] (http://mywiki.wooledge.org/BashFAQ/004)는 베스트 프랙티스 접근법을 다룹니다 일반적으로 파일. [ParsingLs] (http://mywiki.wooledge.org/ParsingLs)는 이런 종류의 유스 케이스에서'ls'를 사용해서는 안되는 이유와 대안을 자세히 설명합니다. –

답변

0

'^.*\.$'이 줄 끝의 점과 일치하기 때문에 정규 표현식이 작동하지 않습니다. 숨김 파일 및 디렉토리를 계산하는 대신에이 명령을 사용하여

ls -ld .* | egrep '^-' | wc -l 
ls -ld .* | egrep '^d' | wc -l 

참고 egrep '^d' 일치 . 너무 .., 그래서 당신은 결과에서 2 뺄 필요

ls -ld .* | egrep '^d' | wc -l | awk '{print $1 - 2}' 

대안 :

ls -ld .* | egrep '^d' | tail -n +3 | wc -l 
echo $(($(ls -ld .* | egrep '^d' | wc -l) - 2)) 
+0

입니다. 이상한 점은 제 예제가 실제로 작동한다는 것입니다.하지만 알아 내지 못합니다. 왜. – Molnia

+2

@ 몰 니아 당신의 코드를 테스트했는데 나에게 도움이되지 못합니다. '.'와'..'와 일치하기 때문에 항상 2를 반환합니다. –

+0

네가 맞다고 생각해. 혼란스러워서 일찍. – Molnia

1

이 목적으로 ls 출력을 구문 분석하는 방법이 잘못되었습니다. 더 나은 대안에 대한 @Dharles Duffy의 대답을 참조하십시오. 하지만 귀하의 질문에 대답하고 정규 표현식을 조금 설명하기 :

'^.*\.$' 나는 당신이 "비밀"파일로 무슨 뜻인지 모르겠지만

^  // From the beginning of the string 
.* // match zero or more of any character 
\. // match one literal full-stop 
$  // end of the string 

의미를 당신은, 즉 하나의 숨겨진 파일을 의미하는 경우 그 다음 .와 함께 파일 이름,이 ls 출력을 구문 분석 할 때하지 않고 단지 파일이나 디렉토리 이름이며, 둘 사이에 구별하지 않는

'^\..*$' 

참고가 될 것입니다 정규식가는 길을 시작한다.

+0

네, 미안 해요. 숨겨진 뜻 이죠. 내 예제가 숨겨진 파일 (내 코드가 아님)에 대해 왜 작동하는지 이해할 수 없습니다. 당신의 예제는 좀 더 논리적 인 것처럼 보입니다. – Molnia

+0

이 방법이 효과가 있습니까? – Molnia

+0

아니요 원래 게시물의 마지막 두 정규 표현식은 항상 "이 디렉토리"및 "상위 디렉토리"에 대한 참조 인 '.' 및'..' 만 일치시킵니다. 따라서 그 결과를 적용한 폴더에 관계없이 결과는 항상 2가됩니다. 귀하의 경우에는 2 개의 숨겨진 파일과 디렉토리가 있음을 우연히 만났을 수도 있습니다 – Pankrates

0

작동해야하는 경우 - L을 사용하면 심볼릭 링크를 찾을 수 있습니다.

+1

실제 이름을 셀 수만을 인쇄 할 때'find'라고 말하면 어떨까요? '-printf .'는 문자를 셀 수있게하거나,'-printf '\ n "는 파이프 라인을 통과하는 데이터가 적은 라인을 카운트 할 수있게하여 비효율을 줄입니다. –

+1

... 또한'wc -lines'는 GNU 시스템에서만 작동하는 반면,'wc -l'은 POSIX 호환 플랫폼에서 작동합니다. –

+0

왜 실제로? 통찰력을 주셔서 감사합니다 :) –

7

이 작업에는 grep (또는 ls)을 사용하지 않아야합니다. ls인 경우에만을 인간에게 대화식으로 표시하는 방법에 대한 심층적 인 토론은 http://mywiki.wooledge.org/ParsingLs을 참조하십시오.

all_files=(*)   # includes directories 
directories=(*/)   # directories only 
hidden_files=(.*)  # includes directories 
hidden_directories=(.*/) # directories only 

echo "Number of files: $((${#all_files[@]} - ${#all_directories[@]}))" 
echo "Number of directories: ${#directories[@]}" 
echo "Number of hidden files: $((${#hidden_files[@]} - ${#hidden_directories[@]}))" 
echo "Number of hidden directories: $((${#hidden_directories[@]} - 2))" 

마지막 계산의 - 2

은 항상 존재합니다 ...을 제거하는 것입니다.

+0

'$ (($ all_files [@]) - $ {# all_directories [@]}) "''$ (($ all_files [@]) - $ {# all_directories [@]})) "'(괄호 누락) –

+0

위 답변 +1 –

+1

@ GergoErdosi 님이 제안한 편집을 해주신 Jaypal에게 감사드립니다. –

1

마지막 두 작품 잘못된하지만

ls -la | egrep '^.*\.$' | wc -l 
ls -la | egrep '^d.*\.$' | wc -l 

return 2

ls -la | egrep '^.*\.$' 
ls -la | egrep '^d.*\.$' 

반환

drwxr-xr-x 7 root root 4096 date time . 
drwxr-xr-x 31 root root 4096 date time .. 

변형 :

secret files: 
ls -la | grep '^-' |awk '{print $9}' |egrep '^\.[^\.]' |wc -l 
secret dirs: 
ls -la | grep '^d' |awk '{print $9}' |egrep '^\.[^\.]' |wc -l 
관련 문제