Bashでプログラムパラメータを使用してクエリからファイル/ディレクトリを除外する方法は?

Bashでプログラムパラメータを使用してクエリからファイル/ディレクトリを除外する方法は?

私が見つけたのは簡単なようです。

find . -type f

プログラムパラメータ行に基づいて特定のファイルまたはディレクトリを除外する方法を見つけようとしています。

bash myscript.sh -excl a b c d 

または、オプションa, b, c, dの次の引数は、除外したい特定のexclファイルまたはディレクトリを参照する正規表現です。

したがって、プログラムを次のように呼び出すと:

bash myscript.sh -excl *.sh somedir

私はsomedirディレクトリと拡張子を持つすべてのファイルを無視したいと思います.sh。バッシュでこれは可能ですか?

答え1

配列を使用したbashソリューション:

#!/bin/bash

declare -a find_arguments=( -type f )

for arg; do

  find_arguments+=( ! -name "$arg" )

done

find . "${find_arguments[@]}"

本当に正規表現が必要な場合は、そうします。-nameしかし、-regex例を見ると、ワイルドカードが欲しいようです。 (POSIXではありませんが、-regexGNUではサポートされていますfind。)

デモ

touch {a,b,c}{x,y,z}
./myscript.sh 'a*' '*z'

出力:

./bx
./by
./cx
./cy

コマンドラインの解析-exclなどは、スクリプトのコマンドラインオプションが一般的にどのように見えるか明確に明らかにしていないため、省略しました。そうであれば、-excl簡単に確認してください([[ "$1" = -excl ]]shift

答え2

-not -nameはい、スクリプトに2番目のパラメータがある場合は、パラメータを追加できます。

#!/bin/bash 

targetDir="$1"
exclude="$2"

findString=" '$targetDir'"

if [[ ! -z "$exclude" ]]; then
        findString="$findString -not -name '$exclude'"
fi
eval "find $findString"

たとえば、

$ ls
file1  file1.sh  file2  file2.sh  file3.sh  file4.sh  file5.sh
$ foo.sh .
.
./file1
./file2
./file1.sh
./file4.sh
./file3.sh
./file5.sh
./file2.sh
$ foo.sh . '*sh'
.
./file1
./file2

除外する複数のパターンを定義するには、次の手順を実行します。

#!/bin/bash 

targetDir="$1"
findString=" '$targetDir'"
shift
exclude="'$1'"
shift
for i in "$@"; do
        exclude="$exclude -a -not -name '$i'";
done
if [[ ! -z "$exclude" ]]; then
        findString="$findString -not -name $exclude"
fi
eval "find $findString"

関連情報