grepアイテムを除いてフォルダ内のすべてのアイテムを削除する方法

grepアイテムを除いてフォルダ内のすべてのアイテムを削除する方法

バックアップに使用されるディレクトリのクリーンアップスクリプトを生成したいと思います。

例:私のディレクトリには、ファイル名に数字が10個のファイルがあります。

たとえば、

b_100
b_101
b_102
b_103
b_104
b_105
b_106
b_107
b_108
b_109
b_110

b_105〜b_110ディレクトリ内の特定のファイルをgrepし、残りのファイルをすべて削除したいと思います。つまり、b_100 b_101 b_102 b_103 b_104はすべて削除/削除されます。

b_110と同じディレクトリにあるファイルをgrepするには、grepさ​​れていないすべてのエントリを削除してください。

答え1

そしてzsh

setopt extendedglob
rm -rf -- ^b_<105-110>

b_名前が10進数で始まり、終了し、値が105から110のファイルとディレクトリを除いて、非表示になっていないすべてのファイルとディレクトリが削除されます。

ファイルのみを削除したい場合b_*:

rm -rf -- b_(*~<105-110>)

~zshグローバルオペレーターですとは別に

またはこれを行うこともできます:

all_b_files=(b_*)
to_exclude=(b_{105..110})
rm -rf -- ${all_b_files:|to_exclude}

そしてksh93またはbash -O extglob(またはzsh -o kshglob):

set -- b_{105..110} # set positional parameters to b_105 b_106...
IFS='|'             # used for joining positional parameters in "$*"
pattern="$*"        # prepare extended ksh glob
IFS=                # empty IFS to prevent splitting
rm -rf -- !($pattern)

答え2

Bashと拡張ワイルドカードを有効にすると、次のことができます。

shopt -s extglob 
glob=$(echo b_{105..110} | sed 's/ /|/g')
rm -- !($glob)

まず、変数をglob次の出力に設定します。

$ echo b_{105..110} | sed 's/ /|/g'
b_105|b_106|b_107|b_108|b_109|b_110

したがって、必要なファイル名のリストは次のとおりです|。これにより、コマンドはrm -- !($glob)一致しないすべてのファイルを削除します$glob

答え3

findを使用して、ディレクトリ内の一致しないすべてのファイルを一覧表示できます。

find /path/to/directory -not -name "file_name_to_keep" -type f

その後、findの出力をxargsにパイプするか、findの組み込みexecまたは削除機能を使用できます。

find /path/to/directory -not -name "file_name_to_keep" -type f -exec rm "{}" \;

または、GNU findに組み込まれている削除オプションを使用してください。

find /path/to/directory -not -name "file_name_to_keep" -type f -delete

検索結果に基づくさまざまな削除方法の詳細は、次のとおりです。「検索」出力に基づいてディレクトリを削除する方法は?

答え4

-v私は質問全体を読んでいませんが、「grepエントリを除外する」と言ったとき、すぐに「...を除くすべて」を意味するgrepパラメータがわからないと思いました。たとえば、次のようになります。

ls -ltra | grep -v .txt

テキストファイルを除くすべてのファイルのリストが表示されます。

関連情報