ディレクトリから特定の拡張子を持つすべてのファイルを削除する方法(最後の5つを除く)

ディレクトリから特定の拡張子を持つすべてのファイルを削除する方法(最後の5つを除く)

このディレクトリには、さまざまな拡張子を持つファイルが含まれています。最後の5つのファイルを除いて、拡張子が.gz、zx、ext4のすべてのファイルを削除したいと思います。これらすべてのファイルを一覧表示できます。

ls -l | grep '\.gz\|xz\|ext4$'

その中で最も古い5つだけをお見せします。

ls -l | grep '\.gz\|xz\|ext4$' | head -5

または、最後の5つのファイルをリストします。

ls -l | grep '\.gz\|xz\|ext4$' | tail -5

しかし、上記のコマンドにリストされている5つのファイルを除くすべてのファイルを削除する方法はわかりません。

ベストアンサー1

一般的なソート順序が適切であり(つまり、ファイル名が日付別に指定されている場合)、シェルが配列をサポートしている場合は、配列を使用して以下を回避できます。使用時の一般的な注意事項ls:

F=(./*.{gz,xz,ext4})          # list files
G=("${F[@]:5}")               # pick all but the first five to another array
G=("${F[@]:0:${#F[@]}-5}")    # or pick all but the last five
rm -- "${G[@]}"               # remove them

zsh独自に日付で並べ替えることができるので、一致するファイルを配列にインポートし、変更時間で並べ替えます。

F=(./*.(gz|xz|ext4)(Om))

((Om)最新順、(om)最新順) 上記のように配列を処理します。


もちろん、変更された日付で並べ替える必要がある場合は、次のものは使用できませんzshファイル名を知ることをお勧めします、簡単なことをお勧めしls -t | tail -n +6ます。 tail -n +6印刷は6行目から始まります。つまり、最初の5行目をスキップします。最初はこれに偏見がありました。)

GNU lsを使用すると、シェルに適した入力を生成するためにファイル名を引用するように要求し、出力に配列を埋めることができると思います。

eval "F=($(ls -t --quoting-style=shell-always ./*.{xz,gz}))"

しかし、これを行うには、それを信じてlsシェルが引用文を解釈する方法に同意する必要があります。

おすすめ記事