最新のフォルダのみを維持しながら、サブフォルダを見つけて削除します。

最新のフォルダのみを維持しながら、サブフォルダを見つけて削除します。

特定のフォルダから最後に作成されたサブフォルダを除いて、すべてのサブフォルダを削除する自動化された方法を設定しようとしています。

たとえば、3つの最新のサブフォルダだけを保持し、他のすべてのサブフォルダを削除したいとします。

与えられたフォルダを想像してみてください。

/some/specific/folder
    /subfolder1
    /subfolder2
    /subfolder3
    /subfolder4
    /subfolder5
    /subfolder6
    /subfolder7
    /subfolder8
    /subfolder9
    /subfolder10

サブフォルダをすべて削除したいのですがsubfolder8subfolder9subfolder10...

これでアーカイブしたいファイルのリストを管理しました。しかし、シェルコマンドでファイルを「反転」する方法は?

cd /some/specific/folder/
ls -tr | head -3

# Gives the following result
subfolder8
subfolder9
subfolder10

# And I am looking for the following :
subfolder1
subfolder2
subfolder3
subfolder4
subfolder5
subfolder6
subfolder7

どんなアイデアがありますか?

答え1

ls -tr | head -3 アーカイブする正しい3つのフォルダが用意されている場合は、他のすべてのls -tr | tail -n +4フォルダも提供されます(最初の3行はスキップ)。

答え2

そしてzsh

cd /some/specific/folder && echo rm -rf -- *(/n[1,-4])

/数字()のソート順によって、n最後の3つのフォルダ()を除くすべてのフォルダが削除されます(ここでsubfolder10後ろに subfolder2)、隠された項目は除外されます。

echo実際に作業を行うには、削除してください。

多くのシステムでは作成時間は記録されず、記録しても(例えば、最新のLinuxなど)簡単に検索する方法はありません。信頼できるのは、最後に変更された日付(出力に表示された日付ls -l)だけです。

最後に変更された3つの項目を除いてすべてを削除するには、次のようにしますzsh

cd /some/specific/folder && echo rm -rf -- *(/Om[1,-4])

Om修正時間に基づいて逆順に並べ替えます(たとえば、最も古いものから最新のものまでls -tr)。

インストールしていないかインストールできませんが、zsh最新のGNUシステムを使用している場合は、次のことができます。

(export LC_ALL=C
cd /some/specific/folder &&
  find . ! -name . -prune -type d ! -name '.*' -printf '%T@\t%f\0' |
    sort -rnz |
    tail -zn +4 |
    cut -zf 2- |
    xargs -r0 echo rm -rf --)

最新のGNUシステムの場合(-zこれらのユーティリティのいくつかは最近追加されました):

(export LC_ALL=C
cd /some/specific/folder &&
  find . ! -name . -prune -type d ! -name '.*' -printf '%T@\t%f\0' |
    tr '\n\0' '\0\n' |
    sort -rn |
    tail -n +4 |
    cut -f 2- |
    tr '\0\n' '\n\0' |
    xargs -r0 echo rm -rf --)

ディレクトリのファイル名に改行、スペース、引用符、またはバックスラッシュが含まれていない場合は、次のこともできます。

cd /some/specific/folder &&
  ls -pt | grep '/$' | tail -n +4 | xargs echo rm -rf --

zshsなどの数値ソートについては、*(n)GNUls -vオプションも参照してください。

関連情報