ソートした後、削除するコマンド出力を見つけます。

ソートした後、削除するコマンド出力を見つけます。

パスの特定のパターンに基づいていくつかのファイルを見つけたいと思います。その後、そのパターンの最新の3つのファイルと削除したい他のファイルだけを保持したいと思います。

答え1

そしてzsh

echo rm -f ./**/*pattern*(.Dom[4,-1])
  • **/あらゆるレベルのサブディレクトリ
  • (...)glob修飾子は、異なる基準に基づいて一致を制限します。
  • .:一般ファイルのみ
  • D:ドットファイル(隠しファイル)を含み、隠しディレクトリを表示します。
  • om:修正時間に基づいて並べ替え(最新の項目から古い項目の順)
  • [4,-1]:4番目から最後まで(したがって最初の3つは省略)

echo(実際の実行のために削除されました)

POSIXシェルとそれに対応するGNUユーティリティを使用するには、次の手順を実行します。

(export LC_ALL=C
find . -name '*pattern*' -type f -printf '%T@/%p\0' |
  sort -zrn |
  tail -zn +4 |
  cut -zd/ -f2- |
  xargs -r0 echo rm -f)

echo(実際の実行のために削除されました)

以前のバージョンのGNUユーティリティでは、次のことが必要になる場合があります。

(export LC_ALL=C
find . -name '*pattern*' -type f -printf '%T@/%p\0' |
  tr '\n\0' '\0\n' |
  sort -rn |
  tail -n +4 |
  cut -d/ -f2- |
  tr '\n\0' '\0\n' |
  xargs -r0 echo rm -f)

答え2

まあ、ソートにはそれに対するロジックが必要ですが、これまでは次のようになります。

#検索したいファイルを含む配列を作成します。
ファイル=$(${PATH_TO_FOLDER} 検索 -f タイプ - 名前 "whatever.whatever")
#配列の合計サイズを取得します
合計サイズ=${#FILES[@]}
#フルサイズから3を減算してしきい値を作成します。
停止=((${totalSize}-3))
#カウンタを0として宣言
カウンター=0
#配列のファイルを1つずつ繰り返します。
「${FILES[@]}」のファイルの場合
する
   #3つのファイルが残るまで必ずしてください
   while [ ${counter} -le ${stopat} ]
   する
      rm -v ${ファイル}
      ((カウンタ++))
   完璧
完璧

または、など-nameの拡張表現を使用できます。*.shhello*.sh*hello.sh

上記のコマンドは、3以外のすべてのファイルを削除します。このコマンドを使用して、sort必要に応じて(サイズ、作成、または変更日を使用して)ファイルをソートします。

FILES=$(find ${PATH_TO_FOLDER} -type f -name "whatever.whatever")

関連情報