現在のディレクトリのファイルを繰り返し、特定の名前パターンを持つ特定のファイルを除外するにはどうすればよいですか?ソリューションはPOSIXと互換性がなければなりません。
除外するファイルが test[0-9].txt および work-.* (正規表現を使用) パターンに従うとします。
これまで私のコードは次のようになります。
for file in *
do
if test "$file" != "test[0-9].txt" -o "$file" != "work-.*"
then
echo "$file"
fi
done
現在の出力は、作業ディレクトリ内のすべてのファイルです。テストのパターンマッチングが間違っていることは確かです。しかし、どのように修正しますか?
答え1
if test "$file" != "test[0-9].txt" -o "$file" != "work-.*"
このtest
ユーティリティはパターンマッチングを実行しません。これにはKsh / Bash / Zsh[[ ]]
設定が必要です(少なくともBashではモードを参照する必要はありません)。だから:
for file in *; do
if [[ "$file" != test[0-9].txt && "$file" != work-.* ]]; then
echo "$file"
fi
done
hello.txt
がある場合は印刷しますが、またははtest1.txt
印刷しませんwork-.foo
。
必要な点を参考にしてくださいそして変えるまたはそこから(x≠aまたはx≠b)はすべてのxと一致します。
望むより:
厳密なPOSIX shでは、以下を使用してパターンマッチングを実行する必要がありますcase
。
for file in *; do
case $file in
test[0-9].txt|work-.*) false;;
*) echo "$file";;
esac
done
test
(に示すように)の後ろに複数の数字を一致させるには、kshスタイルの拡張glob、および(そしてすべてのコンテキストで機能させるにはBashで)test123.txt
必要です。 Kusalanandaが指摘したように、そのルートに行くと、次のこともできます。test+([0-9]).txt
shopt -s extglob
for file in !(test[0-9].txt|work-.*); do
echo "$file"
done
答え2
可能なすべての組み合わせを使用して文字列を作成できます。
all=:
for thing in *test[0-9].txt work-.*; do
all=$all$thing:
done
if [[ "$all" == *:"$file":* ]]; then
# it is in the list