最大サイズのファイルのみを残し、他のファイルをすべて削除する方法

最大サイズのファイルのみを残し、他のファイルをすべて削除する方法

以下のように同じディレクトリに 3 つまたは 4 つのファイルがあります。

AAA.360p.mp4
AAA.450p.mp4
AAA.720p.mp4
AAA.1080p.mp4

これらのファイルのファイル名は、フレーム解像度の表現を除いてほぼ同じです。

(AAA はファイル名の例です。フレーム解像度を除いてこれらのファイル名は同じであることを示します。)

そしてAAAの間にはいくつかのドットがあります。

たとえば、ファイル名は次のようになります。

Interesting.Comedy.E10.200406.450p.mp4
Interesting.Comedy.E10.200406.720p.mp4
Interesting.Comedy.E10.200406.1080p.mp4

各ファイルのサイズは異なります

(ファイルサイズ: 360p < 450p < 720p < 1080p) → 常に当てはまります。

最もサイズの大きい 1 つのファイルのみを保持し、他のすべてのファイルを削除したいと思います。

ディレクトリの場所は/volume1/video/

コマンドは Synology 上でのみ実行されます。(コントロール パネルのタスク スケジューラを使用するため)

説明していただく場合は、上記のように私の場合のディレクトリのパスも含めてください。

(私の理解不足のため、お勧めいただいたコードを適用できないため。申し訳ありません)

答え1

以下のコードは役に立ちますが、まずはファイルのコピーを作成してそのディレクトリで試してみることもできます。

#!/bin/bash

var=`find /volume1/video/ -printf '%s %p\n'| sort -nr | head -n 1 | awk '{ print $2 }'`
largestfilename=`echo $var | rev | cut -d"/" -f1 | rev`

for i in `ls -S /volume1/video/`
do
        if [ ! $i == $largestfilename ]
        then
                rm -f /volume1/video/$i
        fi
done

答え2

LARGEST=$(ls -S /volume1/video/* | head -1)
ls /volume1/video/* | grep -v "$LARGEST" | xargs -d '\n' rm

最初の行は、 内のすべてのファイルを/volume1/video/サイズ順にリストするコマンドを実行し、そのリストを にパイプしてhead最初のファイルを識別します。そのコマンドの出力は、 という名前の変数に格納されます$LARGEST

2 行目では、すべてのファイルを/volume1/video/再度リストし、最大のファイルの名前を grep で抽出し、残りを削除します。

編集: ファイル名の空白文字を考慮するために、xargsに-dフラグを追加しました。この答え詳細については。

関連情報