2013-05-15 4 views
0

Linux에서 현재 디렉토리의 모든 하위 디렉토리를 모니터하고 파일 수를 출력하려고합니다. ,Linux watch 명령 "no such file or directory"

watch 'for FILE in `find . -maxdepth 1 -mindepth 1 -type d | grep -v "unwanted\|directories\|here"`; do echo -n $FILE " "; find $FILE -type f | wc -l; done | column -t' 

이 내가이 오류가 가끔 제외하고 완벽하게 작동 FILE_NAME이 하위 디렉토리 중 하나에있는 파일의 이름입니다

find: `FILE_NAME': No such file or directory 

: 내가 현재 가지고있는 명령입니다.

왜 이런 일이 일어나고 해결할 수 있는지 누가 알 수 있습니까? 감사!

+0

'FILE_NAME'이 가능합니까? 뭔가 다른 것으로 삭제되고 있습니까? 'find'는'find'가 요청한 디렉토리에 있다고 결정한 후에 파일이 삭제 될 수있는 경쟁 조건을 가지고 있지만, 그것이 원 프라이머 중 하나 (이 경우'-type f')로 테스트되기 전에는 경쟁 조건을 가지고 있습니다. – chepner

+0

@chepner 아마도 그 원인 일 겁니다. 디렉터리를 모니터링하는 이유 중 하나는 파일이 제대로 정리되고 있는지 확인하는 것입니다. 이 문제를 해결할 수 있습니까? –

+0

내가 아는 누구도. 어쨌든보고하지 않을 파일을 더 이상 찾을 수 없다는 말을 '발견하다'는 경고 일뿐입니다. 'find $ FILE -type f 2>로'find'의 표준 오류를 억제 할 수 있습니다./dev/null | wc -l;' – chepner

답변

0

귀하의 명령은 파일 이름에 공백을 처리하지 않습니다.

루프를 실행할 때 for x in $(find)...을 실행하지 않거나 적어도 IFS를 $'\n'으로 설정하지 마십시오. 당신은 단지 바로 하위 디렉토리를 돌보는 것 때문에

, 당신도 루프 값 find를 사용할 필요가 없습니다 :

watch 'for FILE in *; do [ -d "$FILE" ] && { echo -n $FILE " "; find $FILE -type f | wc -l; } done | column -t' 

(당신은 * 대신 좀 더 복잡한 패턴을 사용, 또는 수 필터가 echo "$FILE" | grep이면 더 구체적인 일치가 필요합니다.

+0

모두 사실이지만 여기에 공간이 포함 된 파일 이름이 바로 문제가되는 것은 확실하지 않습니다. – chepner

+0

@SirAthos 제안에 감사드립니다. 현재 디렉토리 (또는 하위 디렉토리)에는 공백이 없지만 앞으로도 계속 명심하십시오! –

1

이것은 bash 내장 함수를 사용합니다 (그러나 AFAIK는 bashism 만 export -f이므로 추악한 코드로 mangle하려는 경우/bin/sh를 사용할 수 있습니다). , 읽을 수없는 한 라이너)

#!/bin/bash 
myfunc(){ 
for DIR in "$1/"*; do 
    case "$DIR" in 
     unwanted|dirs)continue;; 
     *)[ -d "$DIR" ] && { 
      printf "%30s " "$DIR" 
      i=0 
      for FILE in "$DIR/"*; do 
       [ -f "$FILE" ] && i=$((i+1)) 
      done 
      echo $i 
     };; 
    esac 
done 
} 
export -f myfunc 
watch myfunc "$HOME" 

공백이있는 파일 이름이 될 수있는 모든 항목은 큰 따옴표로 묶어서 "프로그램 파일"대신 프로그램 및 파일 2 개를 통계 화하지 않도록주의하십시오. 구분자를 사용할 확률이있는 변수를 따옴표로 묶는 것이 가장 좋습니다 (파일 이름에 탭과 개행 문자를 넣을 수 있습니다. "/"이외의 다른 것들도 있습니다.)

관련 문제