web-dev-qa-db-ja.com

並べ替えて削除するコマンド出力を検索する

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

2
user5783725

zshの場合:

echo rm -f ./**/*pattern*(.Dom[4,-1])
  • **/任意のレベルのサブディレクトリ
  • (...)他の基準で一致を修飾するためのglob修飾子:
  • .:通常のファイルのみ
  • D:ドットファイル(隠しファイル)を含め、隠しファイルを調べます
  • om:変更時間による順序(新しいものから古いものへ)
  • [4,-1]:4からth 最後まで(最初の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)
3