ファイルを繰り返し、特定の名前パターンを持つファイルを除外します。シェル

ファイルを繰り返し、特定の名前パターンを持つファイルを除外します。シェル

現在のディレクトリのファイルを繰り返し、特定の名前パターンを持つ特定のファイルを除外するにはどうすればよいですか?ソリューションは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]).txtshopt -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

関連情報