[英]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.