ls
我的任務是在不使用和命令的情況下列印當前目錄中的檔案數量wc
。
我在腳本中輸入了以下幾行:
#!/bin/bash
find . -maxdepth 1 -type f \( ! -iname ".*" \) > list3
grep .* -c list3 > /dev/tty
輸出是:
..:0
.6.1c.sh.swp:1
list3:22
而根據我的理解,它應該只是:22
為什麼這不起作用?
答案1
為什麼grep
無法正常運作
它不起作用,因為您需要知道grep
這.*
就是您正在尋找的實際模式。
grep '.*' -c list3
如果不使用單引號,shell 將擴展.*
到目錄中每個檔案的名稱。這就是所謂的檔案名稱擴充。例如a.txt b.txt
,因此grep
將看到:
grep a.txt b.txt -c list3
自從單引號防止擴張的發生,這就是要走的路。
grep
你的命令錯誤的地方:
順便說一下,這裡的模式你走錯方向了。.
正規表示式中的句點匹配任何字符,而不是字面點。看這一man
頁了解更多。因此,您的正規表示式目前表示:“查找任何字符,然後查找任何字符的序列”。相當多餘。
如果你真的想匹配:
[點][還有什麼]
……你需要轉義點:
\.*
find
您的命令可以改進的地方:
我不知道你的意思是擺脫
\( ! -iname ".*" \)
您的find
命令將為任何文件添加當前工作目錄的點前綴,因此您不會在此處刪除任何內容。你可以直接運行:
find . -maxdepth 1 -type f
答案2
為了解決最初的問題,計算沒有ls
和 的文件wc
:
純shell語法:
files=0
for i in *; do
[ -f "${i}" ] && files=$((files+1))
done
echo ${files}
若要將隱藏檔案新增至計數中,只需在for
循環之前變更通配設定即可。
或:有趣的find
shell 擴充:
echo $(($(find -maxdepth 1 -type f -printf '+1')))