簡體   English   中英

Linux watch命令“沒有這樣的文件或目錄”

[英]Linux watch command “no such file or directory”

在Linux中,我試圖監視當前目錄的所有子目錄並輸出其文件計數。 我目前擁有的命令是:

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是其中一個子目錄中的文件名。

有誰知道為什么會發生這種情況以及如何解決? 謝謝!

這僅使用bash內置函數(但是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"

請注意,可能是帶有空格的文件名都用雙引號引起來,以防止嘗試統計2個目錄:“程序和文件”而不是“程序文件”。 最好的做法是用雙引號將可能有分隔符的變量加引號(順便說一句,您可以在文件名中包含制表符和換行符,以及一些非常奇怪的東西-除了“ /”以外幾乎沒有其他東西)

您的命令不處理文件名中的空格。

避免for x in $(find)...運行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過濾)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM