私が見つけたのは簡単なようです。
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ではありませんが、-regex
GNUではサポートされています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"