
バックアップに使用されるディレクトリのクリーンアップスクリプトを生成したいと思います。
例:私のディレクトリには、ファイル名に数字が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
テキストファイルを除くすべてのファイルのリストが表示されます。