findの-pruneオプションに複数のディレクトリを渡す

findの-pruneオプションに複数のディレクトリを渡す

バックアップファイルを見つけて削除するために使用していますが、find特定のディレクトリを検索から除外したいと思います。バックアップファイル名は、.bckまたはで終わることができます。bak~backup

3 つのディレクトリのみを除外する最小作業例 (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" \) -pruneMWEでは3つしか表示していませんが、除外するディレクトリが10個ほどある場合、構文が少し薄暗く見えます。

サービスにプッシュできる入力ファイル(除外ディレクトリのリストを含む)や、配列やリストなどの設定を使用するよりエレガントな方法はありますか?

もともと質問を書くときは明確ではないので申し訳ありません。

注:trash-putファイルを削除する代わりにファイルを移動するTrashcanユーティリティです[1]。

[1]。https://github.com/andreafrancia/trash-cli

ベストアンサー1

使用-path ... -prune(-oまたは)括弧でグループ化された論理\( ... \)

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
...

おすすめ記事