在 find 指令上執行時 grep 不會產生正確的輸出

在 find 指令上執行時 grep 不會產生正確的輸出

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循環之前變更通配設定即可。

或:有趣的findshell 擴充:

echo $(($(find -maxdepth 1 -type f -printf '+1')))

相關內容