我們有一個高度嵌套的目錄結構,我們有一個目錄,我們稱之為“我的目錄”,在我們的層次結構中出現多次。我有興趣計算所有名為“my Dir”的目錄中“*.csv”檔案的數量(是的,名稱中有一個空格)。我該怎么辦?
我試過這樣的事情,但它不起作用:
find . -type d -name "my Dir" -exec ls "{}/*.csv" \; | wc -l
uj5u.com熱心網友回復:
如果您想在“我的目錄”下匹配模式 '*.csv'的檔案數,則:
- 不求
-type d;要求-type f - 不要問
-name "my Dir"你是否真的想要-name '*.csv' - 不要嘗試
ls *.csv每次匹配,因為如果目錄中有更多 N 個 csv 檔案,您可能會計算每一個 N 次 - 也提防嵌入
{}的-exec代碼!
對于來自 的檔案計數find,我喜歡使用我在 U&L 上從Stéphane Chazelas那里學到的技巧;例如,來自:Linux 中的檔案計數:
find "my Dir" -type f -name '*.csv' -printf . | wc -c
這需要 GNU find,以及-printfPOSIX 標準的 GNU 擴展。
它的作業原理是在“我的目錄”(從當前作業目錄)中查找與模式匹配的檔案;對于每個匹配的檔案,它會列印一個點(句點);這一切都通過管道傳輸給wc誰來計算產生的字符(句點)find的數量——匹配檔案的數量。
uj5u.com熱心網友回復:
您將排除所有不是 My Dir 的路徑:
find . -type f -not '(' -not -path '*/my Dir/*' -prune ')' -name '*.csv'
uj5u.com熱心網友回復:
另一種解決方案是使用-path謂詞來選擇您的檔案。
find . -path '*/my Dir/*.csv'
計算出現次數可能是一個簡單的管道問題wc -l,盡管如果某些檔案的名稱中包含換行符,這顯然會產生錯誤的結果。(這有點病態,但絕對是您想要在生產代碼中涵蓋的內容。)一個常見的安排是為每個找到的檔案列印一個換行符,而不是它的名稱。
find . -path '*/my Dir/*.csv' -printf '.\n' | wc -l
(-printf謂詞不在 POSIX 中,但不難替換為 an-exec或類似的。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/359454.html
