計算目錄中的檔案數

計算目錄中的檔案數

我在一個腳本的末尾使用以下程式碼來統計我已處理並移入該目錄的檔案數量。

# Report on Current Status
echo -n "Cropped Files: "
ls "${Destination}" | wc -l

我的問題在於如何處理重複文件。截至目前,我首先檢查文件是否存在(因為我的腳本本質上對我正在處理的源文件具有破壞性)。如果它檢測到該名稱的文件已被處理,我將按如下方式更改文件名。

重複文件:foo.pdf

更改名稱:foo.x.pdf

如果有 foo.x.pdf,那麼我再次重新命名為 foo.xx.pdf。根據需要重複。我打算稍後再評估每個“版本”並選擇最好的版本保留在手邊。但這就是我的問題。我想計算不包含 .x 的檔案數量。 .xx。等等。如何從輸出中刪除這些內容ls以便wc -l僅計算唯一檔案?

TL;DR:如何取得給定目錄中檔案名稱中不包含給定子字串的檔案數?

答案1

若要尋找目錄中不包含 的檔案數.x.pdf,請嘗試:

find "${Destination}" -mindepth 1 ! -name '*.x.pdf' -printf '1' | wc -c

若要尋找目錄中不包含句點 - 一個或多個x- 句點 -的檔案數pdf,請嘗試:

find "${Destination}" -mindepth 1 ! -regex '.*\.x+\.pdf' -printf '1' | wc -c

上面透過子目錄遞歸搜尋。如果您不想這樣做,請新增選項-maxdepth 1。例如:

find "${Destination}" -mindepth 1 -maxdepth 1 ! -regex '.*\.x+\.pdf' -printf '1' | wc -c

請注意,因為我們使用-printf '1',所以即使目錄包含名稱包含換行符的文件,此方法也是安全的。

答案2

沒有子目錄:

echo $(($(for file in *.sh ; do echo -n 1+; done; echo 0;)))

因為:

for file in *.sh ; do echo -n 1+; done; echo 0;
1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+0

答案3

您可以ls使用(一次或多次)選項-I, --ignore=PATTERN(參考):

ls -I "*.x*.pdf" "${Destination}" | wc -l

或者你可以這樣使用減法:

echo $(($(ls "${Destination}" | wc -l) - $(ls "${Destination}"/*.x*.pdf | wc -l)))

相關內容