2014-01-28 2 views
0

각 홈 디렉토리에있는 파일의 수를 찾기 위해 하나의 라이너를 쓰려고합니다. 나는/home에서 inode가 떨어지는 상황이있는 다른 날에 이것을하려고 노력하고 있습니다. 가해자를 찾는 데 오랜 시간이 걸렸으므로이 과정을 단축하고 싶습니다. 이것은 내가 가진 것이지만 작동하지 않습니다.내 라이너가 실행되지 않는 이유는 무엇입니까

for i in /home/*; do if [ -d "$i" ]; then cd $i find . -xdev -maxdepth 100 -type f |wc -l; fi done 

실행할 때 각 홈 디렉토리에 대해 0을 인쇄하고 뿌리 홈 디렉토리에 남아 있습니다.

그러나 난 그냥이 부분을 실행하면

for i in /home/*; do if [ -d "$i" ]; then cd $i; fi done 

내가 그들 모두를 통과 믿고 저를 선도하는 마지막 홈 디렉토리에 바람.

그리고 각 사용자 홈 디렉토리에서이 프로그램을 실행할 때 :

find . -xdev -maxdepth 100 -type f |wc -l 

나는 합법적 인 답변을 얻을.

+0

cd $ i 후에 &&가 누락 되었습니까? http://stackoverflow.com/questions/9839055/searching-and-counting-files-in-directories-and-subdirectories-bash 또는 http://stackoverflow.com/questions/15216370/과 같이 SO에 대한 다른 질문도 참조하십시오. count-number-of-files-in-each-directory – x29a

+0

누락 된';''cd $ i' ?? –

+0

아니면 그냥'cd' altogeather를 제거하고 (어쨌든 쉘 스크립트에서 사용하는 것이 가장 좋은 방법은 아닙니다) 경로를 찾기에 넣으십시오. 또한, 왜 이것을 "하나의 라이너"로 사용하고 있습니까? – BroSlow

답변

0

cd 다음에 종료 문자가 없습니다. 더 중요한 것은 cd을 사용할 때 조심하지 않으면 원치 않는 오류가 발생할 수 있으므로 아래에서 대신 시도하십시오 (cd 필요 없음). (예 희귀), 당신은 추가로 활용할 수 있습니다

find /home/*/ -xdev -maxdepth 100 -type f | wc -l 

이 파일 이름은 줄 바꿈을 포함하여 모든 문제를 방지하려면 : find 이후

for i in /home/*; do [ -d "$i" ] && echo "$i" && find "$i" -xdev -maxdepth 100 -type f | wc -l; done 
0

당신은 루프를 필요로하지 않는, 여러 경로를 취할 수 있습니다 find에 GNU 확장 (당신은 -maxdepth를 사용하고, 그래서 당신은뿐만 아니라 -printf을 사용할 수 있습니다 가정) :

find /home/*/ -xdev -maxdepth 100 -type f -printf "." | wc -c 

당신이 교류 아니기 때문에 파일 이름을 사용하여 계산하고 한 문자 째 문자열로 바꾸고 결과 문자열의 길이를 계산하십시오.

+0

당신은 개별 디렉토리에 대한 파일 수만 제공합니다. – menders65

관련 문제