Find

將多個目錄傳遞給 find 中的 -prune 選項

  • January 13, 2022

find用於查找和刪除備份文件,但希望從搜尋中排除某些目錄。備份文件名可以以.bckbak~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 ... -pruneusing -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
...

引用自:https://unix.stackexchange.com/questions/73938