find
コマンドから特定のディレクトリを永久に除外するように設定する方法。https://stackoverflow.com/questions/4210042/how-to-exclude-a-directory-in-find-command
bashrcに次のエイリアスを追加してみました。
alias find='find -not \( -path ./.git -prune \)'
うまくいかないようです。
ripgrepでこれを設定できます。https://github.com/BurntSushi/ripgrep/blob/master/GUIDE.md#configuration-file それでは、gitのような特定のディレクトリを一度に除外するようにmake findを設定する方法は?
答え1
myfind
次のラッパースクリプトで作成します。
#! /bin/sh -
predicate_found=false skip_one=false
for arg do
if "$skip_one"; then
skip_one=false
elif ! "$predicate_found"; then
case $arg in
(-depth | -ignore_readdir_race | -noignore_readdir_race | \
-mount | -xdev | -noleaf | -show-control-chars) ;;
(-files0-from | -maxdepth | -mindepth) skip_one=true;;
(['()!'] | -[[:lower:]]?*)
predicate_found=true
set -- "$@" ! '(' -name .git -prune ')' '('
esac
fi
set -- "$@" "$arg"
shift
done
if "$predicate_found"; then
set -- "$@" ')'
else
set -- "$@" ! '(' -name .git -prune ')'
fi
exec find "$@"
オプションではなく、最初の述語の前に挿入し!
(
-name
.git
-prune
)
(または述部が見つからない場合は最後に)、それを使用しないようにし、その間に(
残りをラップします。)
-o
たとえばにmyfind -L . /tmp /etc -maxdepth 1 -type d -o -print
なりますfind -L . /tmp /etc -maxdepth 1 ! '(' -name .git -prune ')' '(' -type d -o -print ')'
。
prune
それはみんな .git
目次。 FreeBSDを使用して引数として渡されたディレクトリごとに深さ1のディレクトリのみを削除するfind
には。-depth 1
-name .git
.git
-mindepth 2
いくつか(または2より大きい数字)を追加すると、最終的にディレクトリに移動する可能性があります。
-prune
と結合(または暗黙)できないことに注意してください。-depth
-delete
-depth
1 ここで GNU を管理するfind
オプション述部コンテンツの前にコンテンツを挿入すると、警告は表示されません。これにはヒューリスティックを使用します。 BSDを使うとだまされるmyfind -f -my-dir-starting-with-dash-...
答え2
ディレクトリを無視するように設定することはできませんfind
。これはうまくいきません。ただし、関数を使用できます(パラメータを受け入れるには関数が必要なのでエイリアスではありません)。エイリアスを追加するシェル初期化ファイルに以下を追加します。
my_find(){
path="$1"
shift
find "$path" -not \( -path ./.git -prune \) "$@"
}
その後、次のように実行できます。
my_find /target/path -name something
このアプローチの重要な欠点は、常に宛先パスを提供する必要があり、デフォルトでは現在のディレクトリから取得できないことです。