2013-05-15 119 views
0

在Linux中,我試圖監視當前目錄的所有子目錄並輸出它們的文件數量。我公司目前擁有的命令是:Linux watch命令「沒有這樣的文件或目錄」

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' 

這完美的作品,除了偶爾我得到這個錯誤,

find: `FILE_NAME': No such file or directory 

其中file_name是在子目錄中的文件的名稱。

有誰知道爲什麼會發生這種情況,以及如何解決它?謝謝!

+0

是否有可能'FILE_NAME'正在被別的東西刪除? 'find'有一個競爭條件,在'find'確定它在請求的目錄中,但在可以用一個初始值(在這種情況下,'-type f')進行測試之前,文件可以被刪除。 – chepner

+0

@chepner這可能是原因。我監視目錄的原因之一是確保正在清理文件。有沒有解決這個問題的方法? –

+0

我沒有意識到。這只是'find'的一個警告,說它不能再找到一個它不會報告的文件。你可以用'find $ FILE -type f 2>/dev/null |來壓制'find'的標準錯誤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 builtins(但AFAIK唯一的bashism是export -f,所以如果你想把它變成醜陋的,所以你可以使用/ 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" 

請注意,任何可能帶有空格的文件名都是雙引號,以防止嘗試使用stat 2目錄:程序和文件而不是「程序文件」。這是最好的做法,雙引號變量有任何機會有分隔符(順便說一句,你可以有文件名中的製表符和換行符+一些非常奇怪的東西 - 幾乎任何東西,但「/」)

相關問題