Linux
如何查找大於指定大小的文件數量超過 x 的所有目錄?
如何查找目錄中包含超過指定數量且大於指定大小的文件的所有文件夾?
一個範例性案例是查找具有拆分電影文件的文件夾,這些文件可以像這樣合併(
ffmpeg -f concat -safe 0 -i <(for f in ./*.mp4; do echo "file '$PWD/$f'"; done) -c copy output.mp4
)。
find . -type d -exec sh -c '[ $(find "$1" -type f -size +1M | wc -l) -gt 1 ]' _ {} \; -print
該範例查找目前目錄中的所有文件夾(您可以將點替換為完整路徑),其中包含 2 個或更多大於 1 MB 的文件。
與
zsh
:x=42 size=M+1 print -rC1 -- **/*(NFe['()(($#)) $REPLY/*(N.L${size}Y${x}[$x]oN)'])
將列印包含至少 42 個大小嚴格大於 1MiB 的文件的目錄。
**/*
: 遞歸萬用字元(...)
: 全域限定符N
:N
ullglob: 如果沒有匹配就不要抱怨F
: 限制為目錄類型為 ull 的文件*(*至少F
有一個條目)。e['code']
: 過濾文件,其e
評估code
返回 true。()(($#)) args
:匿名函式,如果其參數的數量非零,則返回 true$REPLY
:目前正在考慮的文件(此處為目錄)在code
.$REPLY/*
: 裡面的文件。替換$REPLY/**/*
為也計運算元目錄中的文件。.
: 限制為正常文件(排除目錄、符號連結、fifos、設備…)。LM+1
: 限制四捨五入到下一個整數兆字節的大小嚴格大於 1 的文件(大小為 1048577 字節及以上的文件)。Y$x
:停止尋找第x個作為優化。[$x]
:選擇該列表中的第x個(再次作為優化,所以code
只需要檢查它是否傳遞了至少一個參數)。oN
: 不要費心對列表進行排序。
D
如果您還想考慮隱藏的目錄/文件,可以將限定符添加到一個或兩個 glob。但是,如果之後要對這些文件執行某些操作,您可能想要執行以下操作:
for dir in **/*(NF); do large_files=($dir/*(N.LM+1)) (( $#large_files >= 42 )) && do-something-with $large_files done