將多個目錄傳遞給 find 中的 -prune 選項
我
find
用於查找和刪除備份文件,但希望從搜尋中排除某些目錄。備份文件名可以以.bck
、bak
、~
或backup
.只有三個要排除的目錄的最小工作範例 (MWE) 程式碼是:
#! /bin/bash find . -type d \( -path "./.*" -o -path "./Music" -o -path "./Documents" \) -prune -o -type f \( -name "*.bck" -o -name "*.bak" -o -name "*~" -o -name "*.backup" \) -print0 | xargs -0 --no-run-if-empty trash-put
語法
\( -path "dir1" -o -path "dir2" ... -o -path "dirN" \) -prune
似乎有點笨拙,特別是如果要排除大約十個目錄,儘管我在 MWE 中只顯示了三個。是否有更優雅的方式使用輸入文件、排除目錄列表或數組或類似列表的構造,可以將其壓入服務?
很抱歉在我寫原始問題時沒有更明確。
注意:
trash-put
是將文件移動到Trashcan
而不是刪除它們的實用程序$$ 1 $$. $$ 1 $$. https://github.com/andreafrancia/trash-cli
使用 GNU find(即在非嵌入式 Linux 或 Cygwin 下),您可以
-regex
將所有這些-path
萬用字元組合成一個正則表達式。find . -regextype posix-extended \ -type d -regex '\./(\..*|Music|Documents)' -prune -o \ -type f -regex '.*(\.(bck|bak|backup)|~)' -print0 | xargs -0 --no-run-if-empty trash-put
在 BSD 或 macOS 上,使用
-E
而不是-regextype posix-extended
.您可能還想用其標準較短的等效項替換它
-print0 | xargs -0 --no-run-if-empty trash-put
( GNU-specific1¹): .--no-run-if-empty``-exec trash-put {} +
¹ 然而,其他一些實現支持它的較短
-r
形式,甚至是某些 BSD 上的預設形式
通過括號組合在一起的多個
-path ... -prune
using-o
( or ) 邏輯\( ... \)
find /somepath \( -path /a -prune -o \ -path /b -prune -o \ -path /c -prune \ \) \ -o -print
該範例不會迭代
/somepath/a
、/somepath/b
和/somepath/c
.這是一個使用多個表達式和復雜
-exec
動作的人為範例。這會列印 Linux 主機上普通文件的文件路徑和校驗和,修剪主要是臨時文件或字元設備的路徑$ find / \( -path /dev -prune -o \ -path /proc -prune -o \ -path /sys -prune \ \) \ -o -type f \ -printf '%p ' -exec sh -c 'md5sum -- "{}" | cut -f1 -d" "' \; /etc/services 00060e37207f950bf0ebfd25810c19b9 /etc/lsb-release f317530ede1f20079f73063065c1684e /etc/protocols bb9c019d6524e913fd72441d58b68216 /etc/rsyslog.conf 8f03326e3d7284ef50ac6777ef8a4fb8 ...